7

C#.net で DataAdapter を使用しようとしています。それでも私は DataAdapter について何かを理解していません。

DataAdapter と DataReader に関する多くの記事とブログを読みました。

DataAdapter は、必要に応じてデータベースを自動的に開閉することを理解しました。

しかし、

//conn.Open();
AdsDataAdapter da;
da = new AdsDataAdapter("Select * from Test", conn);
AdsCommandBuilder cb;
cb = new AdsCommandBuilder(da);

DataSet ds = new DataSet();
da.Fill(ds, "Test");

DataRow newrow = ds.Tables["Test"].NewRow();
newrow["Name"] = "How about";
ds.Tables["Test"].Rows.Add(newrow);
da.Update(ds, "Test");

上記のコードを実行すると、「接続が開いている必要があります」というエラー メッセージが表示されます。

アダプタが接続を自動的に開けないのはなぜですか?

そして、insertCommand を使用してデータを挿入します (このテストでは、接続を開きました)。

da.InsertCommand = new AdsCommand("INSERT INTO test (NAME) values('Insert Test #1')", conn);
//da.InsertCommand.ExecuteNonQuery(); // it works
da.Update(ds,"Test"); //but it does not works.

Adapter.Update() を使用した多くの例ですが、私にとっては機能しません:(

エラーはなく、何も挿入されていません。

および da.InsertCommand.ExecuteNonQuery(); を使用します。Update() の代わりに動作します。

私は何を間違っていますか?

ありがとう!

4

1 に答える 1

19

MSDNはそれを言う

Fill メソッドは、接続がまだ開いていないことを検出した場合、DataAdapter が使用している接続を暗黙的に開きます。Fill が接続を開いた場合、Fill の終了時に接続も閉じます。これにより、Fill や Update などの単一の操作を処理するときにコードを簡素化できます。

これはda.Fill(ds, "Test");、接続がメソッド自体によって閉じられた後であることを意味します。ただし、次の更新のために開く必要があります(そしてそれは失敗します)

編集:上記のコードから派生した疑似コード

using(AdsConnection com = new AdsConnection(connectionString));
{
    conn.Open();
    using(AdsDataAdapter da = new AdsDataAdapter("Select * from Test", conn))
    {
        AdsCommandBuilder cb = new AdsCommandBuilder(da); 
        DataSet ds = new DataSet(); 
        da.Fill(ds, "Test"); 

        // Now the connection is still open and you can issue other commands

       DataRow newrow = ds.Tables["Test"].NewRow(); 
       newrow["Name"] = "How about"; 
       ds.Tables["Test"].Rows.Add(newrow); 

       // da.Update should work here. No more connection closed.
       da.Update(ds, "Test"); 
    }
} // Exiting from the using block, the connection will be closed
于 2012-04-14T13:20:14.923 に答える