Q1 нет, вам не нужно держать соединение с базой данных открытым. Чтобы выполнить обновление, вы снова открываете соединение и вызываете dataadapter.update ()
q2 почти так же, как q1, пока вы снова не откроете соединение и не вызовете dataadapter.update (), изменения будут только в локальном наборе данных.
- Открытое соединение
- Получить данные
- Закрыть соединение
- манипулировать / добавлять данные
- Открытое соединение
- dataadapter.update ()
- закрыть соединение
Конечно, есть определенные исключения в очень специфических случаях.
Дополнительное замечание: если вы используете c #, я предпочитаю использовать конструкцию USING, которая вызовет dispose для неуправляемых объектов и закроет соединения.
EDIT
Обновление данных с помощью адаптеров данных http://msdn.microsoft.com/en-us/library/33y2221y.aspx
Очень простой пример
{
SqlDataAdapter ad;
SqlConnection con;
SqlCommand cm_insert;
SqlCommand cm_select;
DataSet employees;
employees = new DataSet();
ad = new SqlDataAdapter();
cm_select = new SqlCommand("select * from employees");
cm_insert = new SqlCommand("insert into employees values(@employeename) ");
cm_insert.Parameters.Add("@employeename", SqlDbType.VarChar, 50, "employeename");
ad.InsertCommand = cm_insert;
ad.SelectCommand = cm_select;
using (con = new SqlConnection(@"data source=csl066\sqlexpress;initial catalog=junk;Integrated Security=SSPI;persist security info=False;packet size=4096"))
{
cm_select.Connection = con;
con.Open();
ad.Fill(employees);
}
//Do other work, collect data, sometime later in the app..
using (con = new SqlConnection(@"data source=csl066\sqlexpress;initial catalog=junk;Integrated Security=SSPI;persist security info=False;packet size=4096"))
{
cm_insert.Connection = con;
con.Open();
employees.Tables[0].Rows.Add(new string[] { "Allen" });
ad.Update(employees);
}
}