Параметры DataAdapter
Область применения: платформа .NET Framework .NET Standard
Класс DbDataAdapter имеет четыре свойства, которые служат для получения данных из источника данных и обновления данных в нем: свойство SelectCommand возвращает данные из источника данных, а свойства InsertCommand, UpdateCommand и DeleteCommand используются для управления изменениями в источнике данных.
Примечание.
Свойство SelectCommand
должно быть установлено до вызова метода Fill
объекта DataAdapter
. Свойства InsertCommand
, UpdateCommand
или DeleteCommand
должны быть установлены до вызова метода Update
объекта DataAdapter
в зависимости от того, какие изменения были сделаны в данных в DataTable. Например, если добавлены строки, свойство InsertCommand
должно быть установлено перед вызовом метода Update
. Если метод Update
обрабатывает вставленную, обновленную или удаленную строку, DataAdapter
использует соответствующее свойство Command
для обработки действия. Текущие данные об измененной строке передаются в объект Command
через коллекцию Parameters
.
При обновлении строки в источнике данных вызывается инструкция UPDATE, которая использует уникальный идентификатор для идентификации строки в обновляемой таблице. Уникальным идентификатором обычно является значение поля первичного ключа. Инструкция UPDATE использует параметры, содержащие и уникальный идентификатор, и столбцы и обновляемые значения, как показано в следующей инструкции Transact-SQL.
UPDATE Customers SET CompanyName = @CompanyName
WHERE CustomerID = @CustomerID
Примечание.
Синтаксис местозаполнителей параметров зависит от источника данных. В этом примере показаны местозаполнители для источника данных SQL Server.
В этом примере поле CompanyName
обновляется значением параметра @CompanyName
для строки, в которой CustomerID
равен значению параметра @CustomerID
. Параметры получают данные из измененной строки, используя свойство SourceColumn объекта SqlParameter. Далее представлены параметры для предыдущего образца инструкции UPDATE. В коде предполагается, что переменная adapter
представляет действительный объект SqlDataAdapter.
// Assumes that connection is a valid SqlAdapter object
adapter.UpdateCommand.Parameters.Add("@CompanyName",
SqlDbType.VarChar, 15, "CompanyName");
SqlParameter parameter = adapter.UpdateCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID");
parameter.SourceVersion = DataRowVersion.Original;
Метод Add
коллекции Parameters
принимает имя параметра, тип данных, размер (если он применим к типу) и имя SourceColumn из DataTable
. Обратите внимание, что SourceVersion параметра @CustomerID
установлена в Original
. Это гарантирует, что существующая строка в источнике данных обновляется, если значение идентифицирующих столбцов изменилось в измененном DataRow. В этом случае значение строки Original
будет соответствовать текущему значению в источнике данных и значение строки Current
будет содержать обновленное значение. SourceVersion
для параметра @CompanyName
не установлена и использует значение по умолчанию строки Current
.
Примечание.
Для операций Fill
класса DataAdapter
и методов Get
класса DataReader
тип .NET Framework выводится из значения, возвращенного поставщиком данных Microsoft SqlClient для SQL Server. Выводимые типы .NET и методы доступа для типов данных Microsoft SQL Server описываются в разделе Сопоставление типов данных в ADO.NET.
Parameter.SourceColumn, Parameter.SourceVersion
SourceColumn
и SourceVersion
могут быть посланы как аргументы в конструктор Parameter
или установлены как свойства существующих Parameter
. SourceColumn
является именем DataColumn из DataRow, где значение Parameter
будет получено. SourceVersion
задает версию DataRow
, которую DataAdapter
использует для получения значения.
В следующей таблице показаны значения перечисления DataRowVersion, доступные для использования с SourceVersion
.
Перечисление DataRowVersion | Description |
---|---|
Current |
Параметр использует текущее значение столбца. Это значение по умолчанию. |
Default |
Параметр использует DefaultValue столбца. |
Original |
Параметр использует исходное значение столбца. |
Proposed |
Параметр использует предложенное значение. |
В примере кода для SqlClient
в следующем разделе определяется параметр для UpdateCommand, в котором столбец CustomerID
используется как SourceColumn
для двух параметров: @CustomerID
(SET CustomerID = @CustomerID
) и @OldCustomerID
(WHERE CustomerID = @OldCustomerID
). Параметр @CustomerID
используется для обновления столбца CustomerID текущим значением в DataRow
. В результате используется CustomerID
SourceColumn
с SourceVersion
для Current
. Параметр @OldCustomerID
используется для идентификации текущей строки в источнике данных. Так как в версии Original
строки найдено значение, совпадающее со значением столбца, используется тот же SourceColumn
(CustomerID
) с SourceVersion
для Original
.
Работа с параметрами SqlClient
Следующий пример демонстрирует, как создать SqlDataAdapter и установить MissingSchemaAction в AddWithKey, чтобы получить из базы данных дополнительные сведения о схеме. Устанавливаются свойства SelectCommand, InsertCommand, UpdateCommand и DeleteCommand, и соответствующие им объекты SqlParameter добавляются в коллекцию Parameters. Метод возвращает объект SqlDataAdapter
.
public static SqlDataAdapter CreateSqlDataAdapter(SqlConnection connection)
{
// Assumes that connection is a valid SqlConnection object
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
// Create the commands.
adapter.SelectCommand = new SqlCommand(
"SELECT CustomerID, CompanyName FROM CUSTOMERS", connection);
adapter.InsertCommand = new SqlCommand(
"INSERT INTO Customers (CustomerID, CompanyName) " +
"VALUES (@CustomerID, @CompanyName)", connection);
adapter.UpdateCommand = new SqlCommand(
"UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
"WHERE CustomerID = @oldCustomerID", connection);
adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);
// Create the parameters.
adapter.InsertCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID");
adapter.InsertCommand.Parameters.Add("@CompanyName",
SqlDbType.VarChar, 40, "CompanyName");
adapter.UpdateCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID");
adapter.UpdateCommand.Parameters.Add("@CompanyName",
SqlDbType.VarChar, 40, "CompanyName");
adapter.UpdateCommand.Parameters.Add("@oldCustomerID",
SqlDbType.Char, 5, "CustomerID").SourceVersion =
DataRowVersion.Original;
adapter.DeleteCommand.Parameters.Add("@CustomerID",
SqlDbType.Char, 5, "CustomerID").SourceVersion =
DataRowVersion.Original;
return adapter;
}