DataAdapter不需要打开数据库连接吗?

Exp*_* be 6 c# asp.net advantage-database-server dataadapter

我尝试在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");
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我收到一条错误消息,提示"连接必须打开".

为什么适配器无法自动打开连接?

并且,我想使用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.
Run Code Online (Sandbox Code Playgroud)

很多例子使用Adapter.Update(),但对我来说,它不起作用:(

没有错误,也没有插入.

并使用da.InsertCommand.ExecuteNonQuery(); 而不是Update(),它的工作原理.

我究竟做错了什么?

谢谢!

Ste*_*eve 14

MSDN

如果发现连接尚未打开,则Fill方法隐式打开DataAdapter正在使用的Connection.如果Fill打开连接,它也将在Fill完成时关闭连接.这可以在处理单个操作(如填充或更新)时简化代码.

这意味着在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
Run Code Online (Sandbox Code Playgroud)