0

ローカルの MDB-Access ファイルにデータを挿入する方法があります。このコードを使用すると、正常に動作します。

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() メソッドを呼び出すだけで行を追加、編集、および削除できます。セットアップには、UPDATE、INSERT、DELETE の 3 つのコマンドがすべて必要です。

お役に立てれば

于 2012-09-11T07:36:19.077 に答える
0

IDbConnection.Closeデフォルトでは、メソッドは接続を接続プールに返すだけです。物理接続 (ネットワーク接続またはファイル) は閉じません。接続プールを無効にするか (ただし、アプリケーションの生産性が低下します)、接続プールをクリアすることができます (「 」を参照OleDbConnection.ReleaseObjectPool)。

于 2012-09-11T07:31:04.697 に答える
0

con.close入れてみてくださいfinally()

于 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 に答える