0

我有一种方法可以在本地 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 和 Close 方法放在 foreach 循环之外时,代码可以工作,但是用于连接的本地文件已经用 Visual Studio 打开,因此我无法删除或移动它。连接的状态表示之后con.Close()它已关闭。

这里有什么问题?

4

4 回答 4

1

您不需要在循环中打开和关闭连接。如果您的表中有 500 行,那么您将打开和关闭连接 500 次,这不是最佳做法。

您的连接应该在循环之前的 Try 语句中打开,并在处理完所有行后关闭。

我认为你最好使用 Update() 函数而不是你上面做的方法。

您可以消除循环遍历每一行的需要。

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

使用此功能,您只需调用 Update() 方法即可添加、编辑和删除行。您将需要设置所有 3 个命令,UPDATE、INSERT、DELETE。

希望这可以帮助

于 2012-09-11T07:36:19.077 回答
0

IDbConnection.Close默认情况下,该方法只是将连接返回到连接池。它不会关闭物理连接(网络连接或文件)。您可以禁用连接池(但这会降低应用程序的效率),或清除连接池(请参阅 参考资料OleDbConnection.ReleaseObjectPool)。

于 2012-09-11T07:31:04.697 回答
0

试着放进con.closefinally()

于 2012-09-11T07:31:08.810 回答
0
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
}

为我工作

于 2016-01-05T15:18:57.387 回答