ADO.net - каковы ограничения на подключение к базе данных для использования DataSet и DataAdapter? - PullRequest
0 голосов
/ 12 октября 2009

Re ADO.net, я понимаю концепцию DataSet и DataAdapter. Что не ясно, если я могу спросить:

В1. Какие существуют ограничения на то, должно ли соединение с базой данных оставаться открытым или нет? Могу ли я закрыть соединение, но все еще работать с DataSet? Если так, что должно быть в наличии для выполнения обновления? Нужно ли DataAdapter сохранять активное соединение с базой данных?

Q2 - В более общем смысле, если бы я захотел, во время использования пользователем приложения WinForms пользователь должен был:

  1. Получить исходные данные, доступные в базе данных (например, чтение DataSet с использованием DataAdapter), а затем в какой-то момент времени позже
  2. Добавить новую строку в базу данных и отобразить ее в фактической базе данных (т.е. сохранить)
  3. Добавить еще одну запись (но просто сохранить в памяти / наборе данных)
  4. Через некоторое время СОХРАНИТЕ новую строку, добавленную из [3]

Что бы вы хотели сделать здесь с DataSet / DataAdapter / Connection? Будет ли закрыто соединение с базой данных между всеми шагами в соответствии с рекомендациями по минимизации сохранения базы данных открытой?

1 Ответ

2 голосов
/ 12 октября 2009

Q1 нет, вам не нужно держать соединение с базой данных открытым. Чтобы выполнить обновление, вы снова открываете соединение и вызываете dataadapter.update ()

q2 почти так же, как q1, пока вы снова не откроете соединение и не вызовете dataadapter.update (), изменения будут только в локальном наборе данных.

  1. Открытое соединение
  2. Получить данные
  3. Закрыть соединение
  4. манипулировать / добавлять данные
  5. Открытое соединение
  6. dataadapter.update ()
  7. закрыть соединение

Конечно, есть определенные исключения в очень специфических случаях.

Дополнительное замечание: если вы используете 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);
        }

    }
...