Страница 6 из 6 Передача обновлений в БД Для передачи изменений в БД используется объекты DataAdapter. Для создания логики обновления БД можно использовать один из трех вариантов: 1. вручную сконфигурировать DataAdapter в период разработки; 2. воспользоваться объектом CommandBulder в период выполнения; 3. использовать в период разработки DataAdapter Configuration Wizard. Ручное конфигурирование DataAdapter DataAdapter имеет 3 свойства для передачи изменений в БД: InsertCommand, UpdateCommand и DeleteCommand. Значения этих свойства должны быть заданы до вызова метода DataAdapter.Update() с учетом того, какие изменения были внесены в DataSet. Когда метод Update() добавляет, обновляет или удаляет строки в таблице, он вызывает соответствующую команду. Если в ходе ваших действий вы только добавляли строки в таблицу, то и задать вы должны только значение InsertCommand. Ниже приведен код для такой ситуации: string conn = "Provider = SQLSQL; Data Source = (local)\\NetSDK; Initial Catalog= Northwind; Trusted_Connection=Yes;"; string query = "SELECT CustomerID, CompanyName, ContactName, Phone FROM Customers"; SqlDataAdapter da = new SqlDataAdapter(query, conn); DataSet table = new DataSet(); da.Fill(table, "Customers"); // добавляем новые строки в таблицу ... // создаем команду для вставки новых записей query = "INSERT INTO Customers (CustomerID, CompanyName, ContactName, Phone) VALUES (?, ?, ?, ?)"; SqlCommand cmd = new SqlCommand(query, conn); SqlParameterCollection pc = cmd.Parameters; pc.Add("CustomerID", SqlType.Integer, 0, "CustomerID"); pc.Add("CompanyName", SqlType.String, 0, "CompanyName"); pc.Add("ContactName", SqlType.String, 0, "ContactName"); pc.Add("Phone", SqlType.String, 0, "Phone"); da.InsertCommand = cmd; da.Update(table); Подобный подход может применяться и при передаче обновлений в БД при помощи хранимых процедур. Допустим, что имя хранимой процедуры для добавления нового покупателя это spInsertCustomer. Тогда наш код измениться следующим образом: OleDbCommand cmd = new OleDbCommand("spInsertCustomer", conn); cmd.CommandType = CommandType.StoredProcedure; OleDbParameterCollection pc = cmd.Parameters; pc.Add("CustomerID", SqlType.Integer, 0, "CustomerID"); pc.Add("CompanyName", SqlType.String, 0, "CompanyName"); pc.Add("ContactName", SqlType.String, 0, "ContactName"); pc.Add("Phone", SqlType.String, 0, "Phone"); Использование CommandBuilder CommandBuilder генерирует SQL запросы обращаясь к БД для получения метаданных о таблицах. Для использования CommandBuilder необходимо выполнение следующих условий: 1. запрос возвращает данные только из одной таблицы; 2. в таблице определен первичный ключ; 3. первичный ключ есть в результатах запроса. Ниже приведен пример использования CommandBuilder. string con ="Provider=SQLOLEDB;Data Source=(local)\\NetSDK;InitialCatalog=Northwind; Trusted_Connection=Yes;"; string query = "SELECT OrderID, ProductID, Quantity, UnitPrice FROM [Order Details]"; OleDbDataAdapter da = new OleDbDataAdapter(strSQL, strConn); OleDbCommandBuilder cb = new OleDbCommandBuilder(da); da.InsertCommand = cb.GetInsertCommand(); da.Update(tbl); Использование мастера Data Adapter Configuration Wizard Одно из предназначений мастера - создание логики обновления базы данных. На четвертом шаге мастера по команде Advanced Options выводится диалог, в котором можно указать создавать или нет команды для вставки, обновления и удаления записей в БД. На третьем же шаге работы мастер можно указать способ передачи обновления в БД: с помощью SQL запросов, с помощью существующей хранимой процедуры или создание новой хранимой процедуры. Никаких дополнительный действий для создания логики обновления не нужно. Кондратьев Денис |