Работа с SqlCommandBuilder

190
06 апреля 2019, 07:30

У меня есть 2 таблицы, хочу добавить по строке в каждую и передать изменения в БД. Пользуюсь при этом SqlCommandBuilder. Вот мой код:

 string connectionString = @"Data Source=WKS456\SQLEXPRESS;Initial Catalog=ShopDB;Integrated Security=True";
        string sql = "SELECT * FROM Customers;Select * FROM Employees";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
            DataSet ds = new DataSet();
            adapter.Fill(ds);
            DataTable customers = ds.Tables[0];
            DataTable employees = ds.Tables[1];
            // добавим новую строку в первую таблицу:
            DataRow newRow = customers.NewRow();
            newRow["FName"] = "x";
            newRow["LName"] = "x";
            newRow["Address1"] = "x";
            newRow["City"] = "x";
            newRow["Phone"] = "x";
            customers.Rows.Add(newRow);
            // добавим новую строку во вторую таблицу:
            DataRow newRow1 = employees.NewRow();
            newRow1["EmployeeID"] = 101;
            newRow1["FName"] = "x";
            newRow1["LName"] = "x";
            newRow1["MName"] = "x";
            newRow1["Salary"] = 111;
            newRow1["PriorSalary"] = 111;
            newRow1["HireDate"] = "9999 / 12 / 31";
            newRow1["ManagerEmpID"] = 5;
            employees.Rows.Add(newRow1);
            //Создаю SqlCommandBuilder:
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
        adapter.Update(ds);

Далее наблюдаю странную работу, а именно: изменения отправляются только в одну таблицу, причем в первую (customers). Во второй(employees)-тишина. Пробовал закомментить добалвение строки в первую таблицу, т.е. оставил только вторую - всё отработало - во второй таблице (employees)- строка появилась. Но почему не работает на 2 одновременно таблицы? я пробовал разные перегрузки adapter.Update(...) - но ничего не помогает.

Answer 1

Когда вы создали экземпляр адаптера этой строкой:

SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);

у него было задано свойство SelectCommand, которое используется при получении данных из БД методом Fill.

Метод Update использует в своей работе свойство UpdateCommand. Если вы его не задали каким-либо образом, то это свойство равно null.

Нужно либо вручную его задать:

adapter.UpdateCommand = new SqlCommand("UPDATE ...");

либо сгенерировать автоматически с помощью SqlCommandBuilder.

Этой строкой вы создали экземпляр билдера:

SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);

Далее нужно либо вызвать его метод, чтобы сгенерировать sql-код и назначить эту команду соответствующему свойству:

adapter.UpdateCommand = commandBuilder.GetUpdateCommand();

либо, если это свойство ещё не задано, то при первом вызове метода adapter.Update билдер будет использован автоматически.

Собственно, всё выше написанное лишь объяснение принципов работы, а ответ на вопрос вот:

Проверил работу билдера на sql-коде, содержащем два запроса select. Он генерирует update только по первому селекту.

Поэтому либо используйте два вызова подряд, либо задавайте код обновления вручную.

READ ALSO
Не работает Environment.NewLine в Mono

Не работает Environment.NewLine в Mono

Наступил на граблиИспользую RichTextBox в приложение на WindowsForms, которое в дальнейшем запускаю на Ubuntu коммандой mono TestApp

173
Нахождение чисел на картинке

Нахождение чисел на картинке

Изображение на вход

155
Поиск члена арифметической прогрессии

Поиск члена арифметической прогрессии

Скажите как найти мне номер члена арифметической прогрессии, если мне дано:

187
Не работает функция move_uploaded_file

Не работает функция move_uploaded_file

Хочу загрузить фотографию выбранную через input file на серверНо данная функция move_uploaded_file не работает

218