DataAdapter не нужно делать соединение с БД открытым?
Я пытаюсь использовать DataAdapter в C#.net. и до сих пор я не понимаю что-то о 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 () это работает.
Что я делаю неправильно?
Спасибо!
1 ответ
MSDN говорит, что
Метод Fill неявно открывает Соединение, которое использует DataAdapter, если обнаруживает, что соединение еще не открыто. Если 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