У меня есть 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(...) - но ничего не помогает.
Когда вы создали экземпляр адаптера этой строкой:
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
только по первому селекту.
Поэтому либо используйте два вызова подряд, либо задавайте код обновления вручную.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Наступил на граблиИспользую RichTextBox в приложение на WindowsForms, которое в дальнейшем запускаю на Ubuntu коммандой mono TestApp
Скажите как найти мне номер члена арифметической прогрессии, если мне дано:
Хочу загрузить фотографию выбранную через input file на серверНо данная функция move_uploaded_file не работает