Я пишу приложение, которое должно иметь возможность:
- Графический интерфейс должен отображаться в веб-интерфейсе (поэтому я использую веб-приложение С#)
- Уметь выбирать файлы .mdb
- Добавить строки
- Удалить строки
- Изменить строки
- Сохраните все обратно в файл .mdb.
Я гуглил целую вечность.
Я написал аналогичное приложение в обычном приложении формы Windows на С#, я использовал OLEdb, чтобы делать все, и оно работало нормально, оно не ограничивалось только одним файлом .mdb.
В приложении C# Windows Form я использовал элемент управления Gridview. Поскольку в веб-приложении нет Gridview, я использовал сетку данных.
Вот код, который есть до сих пор:
public partial class _Default : System.Web.UI.Page
{
string databasePath = "____________.mdb";
DataTable userTable = new DataTable();
OleDbDataAdapter adapter;
OleDbConnection connection;
OleDbCommand command;
OleDbCommandBuilder builder;
DataSet ds;
DataSet tempDs;
public string DatabaseName = null;
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=";
protected void Page_Load(object sender, EventArgs e)
{
tbDatabasePath.Text = databasePath;
}
protected void btnLoadData_Click(object sender, EventArgs e)
{
ReadRecords();
}
protected void btnGetTables_Click(object sender, EventArgs e)
{
try
{
ddTables.Items.Clear();
ddTables.Text = null;
getTables();
}
catch (Exception ex)
{
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('Could not retrieve the Tables');", true);
}
}
private void getTables()
{
string tempstring = "";
string getTConnection = connectionString + databasePath; ;
OleDbConnection myConnection = new OleDbConnection(getTConnection);
myConnection.Open();
DataTable datT = myConnection.GetSchema("Tables");
for (int i = 0; i < datT.Rows.Count; i++)
{
tempstring = datT.Rows[i][2].ToString();
if (tempstring.Contains("MSys"))
{
}
else
{
ddTables.Items.Add(datT.Rows[i][2].ToString());
}
}
myConnection.Close();
}
private void ReadRecords()
{
datagrid.DataSource = null;
OleDbDataReader reader = null;
try
{
connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=" + databasePath);
OleDbCommand cmd = new OleDbCommand("Select * FROM " + ddTables.Text, connection);
adapter = new OleDbDataAdapter(cmd);
builder = new OleDbCommandBuilder(adapter);
ds = new DataSet("MainDataSet");
tempDs = new DataSet("TempDataSet");
connection.Open();
adapter.Fill(tempDs);
tempDs.Clear();
tempDs.Dispose();
adapter.Fill(ds, ddTables.Text);
userTable = ds.Tables[ddTables.Text];
}
catch
{
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('Could not load the data');", true);
}
finally
{
if (reader != null) reader.Close();
//if (connection != null) connection.Close();
datagrid.ShowFooter = true;
}
CreateTempTable(0, 10);
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('DONE');", true);
}
private void ReadRecords2()
{
// datagrid.DataSource = null;
OleDbDataReader reader = null;
try
{
connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + "Data Source=" + databasePath);
OleDbCommand cmd = new OleDbCommand("Select * FROM " + ddTables.Text, connection);
adapter = new OleDbDataAdapter(cmd);
builder = new OleDbCommandBuilder(adapter);
ds = new DataSet("MainDataSet");
tempDs = new DataSet("TempDataSet");
connection.Open();
adapter.Fill(tempDs);
tempDs.Clear();
tempDs.Dispose();
adapter.Fill(ds, ddTables.Text);
userTable = ds.Tables[ddTables.Text];
}
catch
{
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('Could not load the data');", true);
}
finally
{
if (reader != null) reader.Close();
//if (connection != null) connection.Close();
}
CreateTempTable(0, 10);
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('DONE');", true);
}
private void CreateTempTable(int startRecord, int noOfRecords)
{
try
{
userTable.Rows.Clear();
adapter.Fill(ds, "");
userTable = ds.Tables[""];
}
catch (Exception ex)
{
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('Could not load the data in CreateTempTable');", true);
}
datagrid.DataSource = userTable.DefaultView;
datagrid.DataBind();
}
protected void datagrid_RowEditing(object sender, GridViewEditEventArgs e)
{
datagrid.EditIndex = e.NewEditIndex;
ReadRecords();
}
protected void datagrid_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void datagrid_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
adapter.Update(userTable);
}
protected void datagrid_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
adapter.Update(userTable);
ReadRecords();
}
protected void datagrid_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
datagrid.EditIndex = -1;
ReadRecords();
}
protected void datagrid_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int rowToDelete = e.RowIndex;
datagrid.DeleteRow(rowToDelete);
adapter.Update(userTable);
ReadRecords();
}
}
}
Он может :
- получить файл .mdb
- получить таблицы в файле и отобразить его
- прочитать данные из выбранной таблицы и отобразить их в виде сетки
- добавить кнопки редактирования удаления
Теперь, когда я нажимаю кнопку редактирования, выбранная строка становится доступной для редактирования. Но когда я нажимаю кнопку обновления, я получаю «Ссылка на объект не указывает на экземпляр объекта». Код работал в приложении Forms.
Есть ли способ adapter.Update(userTable); сможет ли он работать так же, как в приложении форм?
Может ли кто-нибудь помочь мне увидеть мою проблему. Если бы я мог заставить его сохранить изменения обратно в файл .mdb, я был бы очень рад.
adapter
не равно нулю в методе datagrid_RowUpdating? - person Blachshma   schedule 04.09.2012