0

oldedbデータプロバイダーを使用して、Microsoftアクセスをデータベースとして使用するWindowsアプリケーションに取り組んでいます。このプロジェクトでは、xml ファイルをインポートして、データをデータベースに書き込んでいました。一度に 1 つのレコードを挿入するのではなく、一括挿入を行いたい。だから私はDAO approchで試してみましたが、時には次のような例外が発生しました

「現在ロックされており、更新できません」

これが私が使用したコードです。

using TEST = Microsoft.Office.Interop.Access.Dao;

Pubic void Insert()
{

        string sBaseDirectory = (AppDomain.CurrentDomain.BaseDirectory).ToString();
            string sODBPath = sBaseDirectory + @"\TEST.accdb";
            TEST.DBEngine dbEngine = new TESt.DBEngine();
            TEST.Database db = dbEngine.OpenDatabase(sODBPath);
            TEST.Recordset rsTest = db.OpenRecordset("dtTest");
        for(int i=0;i<1000;i++)
                {
                    rsTest.AddNew();
                    rsTest.Fields["ID"].Value =i;
                    rsTest.Fields["Name"].Value ="Test";
                    rsTest.update();

                 }
        rsTest.close();
        db.close();

}

Oldedb の場合:

    DataTable dt = new DataTable();
    dt.Columns.Add("ID", typeof(int));
    dt.Columns.Add("Name", typeof(string));

    string TableSQl = "Select * from dtTest where ID=0";
    OleDbDataAdapter dataAdapter=new OleDbDataAdapter(TableSQl,ConnectionString);
    dataAdapter.InsertCommand = new OleDbCommand(INSERT);
    OleDbConnection OleConn = new OleDbConnection(ConnectionString);

       for(int i=0;i<1000;i++)
        {
          dataAdapter.InsertCommand.Parameters.Add("ID", OleDbType.BigInt, 8,i.ToString());
          dataAdapter.InsertCommand.Parameters.Add("Name", OleDbType.BigInt, 8, "test");              
    }

    dataAdapter.InsertCommand.Connection = OleConn;
    dataAdapter.InsertCommand.Connection.Open();  
    dataAdapter.update(dt);        
    dataAdapter.InsertCommand.Connection.Close();

ここでは、テーブルにレコードを挿入していません。

このコードの何が問題なのか、また良いアプローチも教えてください。

4

1 に答える 1

0

http://msdn.microsoft.com/en-us/library/bbw6zyha(v=vs.80).aspx - 「DataAdapter でパラメーターを使用する」を参照してください。

Parameters コレクションの Add メソッドは、パラメーターの名前、DataAdapter 固有の型、サイズ (型に該当する場合)、およびSourceColumn の名前を DataTable から取得します

そのため、パラメーターを正しく作成し、DataTable にデータを入力してから、Update を呼び出す必要があります。

とにかく、このアプローチが一度に1つずつ行うのではなく、挿入をバッチ処理することを示唆するドキュメントはありますか?

于 2012-08-10T09:55:11.773 に答える