我有一个方法,在本地MDB Acces文件中插入一些数据。有了这个代码,它工作得很好:
try
{
foreach (DataRow rowS99 in dtS99.Rows)
{
con.Open();
da.InsertCommand = con.CreateCommand();
da.InsertCommand.Parameters.AddWithValue("@wertListName", rowS99["WertListName"]);
da.InsertCommand.Parameters.AddWithValue("@key", rowS99["Key"]);
da.InsertCommand.Parameters.AddWithValue("@bezeichner", rowS99["Bezeichner"]);
da.InsertCommand.Parameters.AddWithValue("@keyAufbereitet", rowS99["KeyAufbereitet"]);
da.InsertCommand.CommandText = sql;
da.InsertCommand.ExecuteNonQuery();
con.Close();
}
check = true;
}
当我将Open and Close方法放在foreach循环之外时,代码可以工作,但与连接一起使用的本地文件已经用Visual Studio打开,因此我无法删除或移动它。连接的状态在con.Close()
之后表示它已关闭。
这里有什么问题?
您不需要在循环中打开和关闭连接。如果你的桌子上有500行,那么你将打开&关闭连接500次,这不是最佳做法。。
您的连接应在循环之前在Try语句中打开,并在处理完所有行后关闭。
我认为你最好使用Update()函数,而不是上面的方法。
您可以省去遍历每一行的需要。
http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx
使用此功能,您可以通过调用Update()方法来添加、编辑和删除行。您将需要所有3个命令设置,UPDATE,INSERT,DELETE。
希望这能帮助
IDbConnection.Close
方法只将连接返回到连接池。它不会关闭物理连接(网络连接或文件)。您可以禁用连接池(但这会降低应用程序的生产效率),也可以清除连接池(请参阅OleDbConnection.ReleaseObjectPool
)。
尝试将con.close
放入finally()
。
try
{
con.Open();
foreach (DataRow rowS99 in dtS99.Rows)
{
da.InsertCommand = con.CreateCommand();
da.InsertCommand.Parameters.AddWithValue("@wertListName", rowS99["WertListName"]);
da.InsertCommand.Parameters.AddWithValue("@key", rowS99["Key"]);
da.InsertCommand.Parameters.AddWithValue("@bezeichner", rowS99["Bezeichner"]);
da.InsertCommand.Parameters.AddWithValue("@keyAufbereitet", rowS99["KeyAufbereitet"]);
da.InsertCommand.CommandText = sql;
da.InsertCommand.ExecuteNonQuery();
}
con.Close();
check = true;
OleDb.OleDbConnection.ReleaseObjectPool();
GC.Collect(); // I know attation
}
适用于我