C# 如何正确处理数据库和连接
在我的C应用程序中,我有一个目录列表,我希望用户能够在网格上显示和更新这些目录 为了实现这一点,我显示了网格并设置了Update命令,因此每当用户更改网格中的某些内容时,MsAccess数据库都会更新 每当按下某物目录按钮时,UpdateGrid函数就会运行。此函数接收表名和更新查询,以及进行更新的参数列表C# 如何正确处理数据库和连接,c#,wpf,ms-access,visual-studio-2013,data-binding,C#,Wpf,Ms Access,Visual Studio 2013,Data Binding,在我的C应用程序中,我有一个目录列表,我希望用户能够在网格上显示和更新这些目录 为了实现这一点,我显示了网格并设置了Update命令,因此每当用户更改网格中的某些内容时,MsAccess数据库都会更新 每当按下某物目录按钮时,UpdateGrid函数就会运行。此函数接收表名和更新查询,以及进行更新的参数列表 private void UpdateGrid(string data, string queryUpdate, List<Tuple<string, OleDbType,int
private void UpdateGrid(string data, string queryUpdate, List<Tuple<string, OleDbType,int>> parameters, bool Fuse, string description)
{
tblName.Text = description;
try
{
OleDbConnection conn = (Fuse ? new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Fusing.mdb") : new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=MaterialDB.mdb"));
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + data, conn);
myDataSet = new DataSet();
adapter.Fill(myDataSet, data);
DataTable myDataTable = myDataSet.Tables[data];
// Create the UpdateCommand.
OleDbCommand command = new OleDbCommand(queryUpdate, conn);
// Add the parameters for the UpdateCommand.
foreach (var param in parameters)
{
command.Parameters.Add("@" + param.Item1, param.Item2, param.Item3, param.Item1);
}
command.Parameters.Add("@ID", OleDbType.Integer, 5, "ID");
adapter.UpdateCommand = command;
// Update the DB whenever a row changes
myDataTable.RowChanged += (s, f) =>
{
adapter.Update(myDataTable);
};
var be = CatalogsGrid.GetBindingExpression(DataGrid.ItemsSourceProperty);
CatalogsGrid.DataContext = myDataSet;
CatalogsGrid.ItemsSource = myDataSet.Tables[0].DefaultView;
Binding nbe = new Binding
{
Source = myDataSet,
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
Path = new PropertyPath(data),
BindsDirectlyToSource = true
};
CatalogsGrid.SetBinding(DataGrid.ItemsSourceProperty, nbe);
CatalogsGrid.Items.Refresh();
}
catch (Exception)
{
return;
}
}
然后更新停止工作,并出现一个一般性错误,告诉您更新查询是错误的
我应该使用每个连接、数据适配器和命令,还是让它们在C决定时消亡
编辑:
下面是使用的代码:
private void UpdateGrid(string data, string queryUpdate, List<Tuple<string, OleDbType,int>> parameters, bool Fuse, string description)
{
tblName.Text = description;
try
{
using (OleDbConnection conn = (Fuse ? new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Fusing.mdb") : new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=MaterialDB.mdb")))
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + data, conn))
{
myDataSet = new DataSet();
adapter.Fill(myDataSet, data);
DataTable myDataTable = myDataSet.Tables[data];
// Create the UpdateCommand.
using (OleDbCommand command = new OleDbCommand(queryUpdate, conn))
{
// Add the parameters for the UpdateCommand.
foreach (var param in parameters)
{
command.Parameters.Add("@" + param.Item1, param.Item2, param.Item3, param.Item1);
}
command.Parameters.Add("@ID", OleDbType.Integer, 5, "ID");
adapter.UpdateCommand = command;
// Update the DB whenever a row changes
myDataTable.RowChanged += (s, f) =>
{
adapter.Update(myDataTable);
};
var be = CatalogsGrid.GetBindingExpression(DataGrid.ItemsSourceProperty);
CatalogsGrid.DataContext = myDataSet;
CatalogsGrid.ItemsSource = myDataSet.Tables[0].DefaultView;
Binding nbe = new Binding
{
Source = myDataSet,
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
Path = new PropertyPath(data),
BindsDirectlyToSource = true
};
CatalogsGrid.SetBinding(DataGrid.ItemsSourceProperty, nbe);
CatalogsGrid.Items.Refresh();
}
}
}
}
catch (Exception)
{
return;
}
}
当运行此代码时,我得到以下异常
我在互联网上的搜索表明,这是数据库更新过程中发生的任何错误的一般错误,99%的时间不是查询中的错误,我们知道情况并非如此,因为在我们放置using语句之前,一切正常。始终使用积木作为一次性用品。请看。另外,你的空捕获是非常糟糕的做法,你吞下了异常,什么也不做。如果你把它留在家里,你将不知道为什么某些东西会停止工作。记录异常并恢复或根本不捕获完全删除try/catch。您应该使用实现的所有内容。@MichaelGunter-这是指向OLEDB连接的链接和代码。但它似乎仍然有效,因为它是从DataAdapter继承的,DataAdapter是从实现IDisposable的组件继承的。@MichaelGunter噢,该死的。谢谢,我没有在组件上看到它。这将教会我在睡觉前评论;然后更新停止工作,并出现一个一般性错误,告诉您更新查询是错误的。
private void UpdateGrid(string data, string queryUpdate, List<Tuple<string, OleDbType,int>> parameters, bool Fuse, string description)
{
tblName.Text = description;
try
{
using (OleDbConnection conn = (Fuse ? new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Fusing.mdb") : new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=MaterialDB.mdb")))
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + data, conn))
{
myDataSet = new DataSet();
adapter.Fill(myDataSet, data);
DataTable myDataTable = myDataSet.Tables[data];
// Create the UpdateCommand.
using (OleDbCommand command = new OleDbCommand(queryUpdate, conn))
{
// Add the parameters for the UpdateCommand.
foreach (var param in parameters)
{
command.Parameters.Add("@" + param.Item1, param.Item2, param.Item3, param.Item1);
}
command.Parameters.Add("@ID", OleDbType.Integer, 5, "ID");
adapter.UpdateCommand = command;
// Update the DB whenever a row changes
myDataTable.RowChanged += (s, f) =>
{
adapter.Update(myDataTable);
};
var be = CatalogsGrid.GetBindingExpression(DataGrid.ItemsSourceProperty);
CatalogsGrid.DataContext = myDataSet;
CatalogsGrid.ItemsSource = myDataSet.Tables[0].DefaultView;
Binding nbe = new Binding
{
Source = myDataSet,
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
Path = new PropertyPath(data),
BindsDirectlyToSource = true
};
CatalogsGrid.SetBinding(DataGrid.ItemsSourceProperty, nbe);
CatalogsGrid.Items.Refresh();
}
}
}
}
catch (Exception)
{
return;
}
}