Parámetros de objetos DataAdapter
Se aplica a: .NET Framework .NET .NET Standard
DbDataAdapter tiene cuatro propiedades que se utilizan para recuperar y actualizar datos en el origen de datos: la propiedad SelectCommand devuelve datos del origen de datos y las propiedades InsertCommand, UpdateCommand y DeleteCommand se utilizan para administrar los cambios en el origen de datos.
Nota
La propiedad SelectCommand
debe establecerse antes de llamar al método Fill
de DataAdapter
. Las propiedades InsertCommand
, UpdateCommand
o DeleteCommand
se deben establecer antes llamar al método Update
de DataAdapter
, en función de las modificaciones realizadas en los datos en DataTable. Por ejemplo, si se han agregado filas, se debe establecer InsertCommand
antes de llamar a Update
. Cuando Update
procesa una fila insertada, actualizada o eliminada, DataAdapter
utiliza la propiedad Command
que corresponde a la acción en cuestión. La información actual relacionada con la fila modificada se pasa al objeto Command
a través de la colección Parameters
.
Al actualizar una fila en el origen de datos, se llama a la instrucción UPDATE, que usa un identificador único para identificar la fila de la tabla que se va a actualizar. El identificador único suele ser el valor del campo de clave principal. La instrucción UPDATE utiliza parámetros que contienen el identificador único y las columnas y valores que se van a actualizar, como muestra la siguiente instrucción Transact-SQL.
UPDATE Customers SET CompanyName = @CompanyName
WHERE CustomerID = @CustomerID
Nota
La sintaxis de los marcadores de posición de parámetros depende del origen de datos. En este ejemplo se muestran marcadores de posición para un origen de datos de SQL Server.
En este ejemplo, el campo CompanyName
se actualiza con el valor del parámetro @CompanyName
para la fila, donde CustomerID
equivale al valor del parámetro @CustomerID
. Los parámetros recuperan información de la fila modificada mediante la propiedad SourceColumn del objeto SqlParameter. A continuación se muestran los parámetros del ejemplo anterior de la instrucción UPDATE. En el código se parte de que el adapter
de la variable representa a un objeto SqlDataAdapter válido.
// 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;
El método Add
de la colección Parameters
toma el nombre del parámetro, el tipo de datos, el tamaño (si corresponde al tipo) y el nombre de la propiedad SourceColumn de DataTable
. Tenga en cuenta que SourceVersion del parámetro @CustomerID
se establece en Original
. De esta forma se garantiza que la fila existente en el origen de datos se actualice cuando el valor de la columna o columnas identificadas haya cambiado en la fila DataRow modificada. En ese caso, el valor de la fila Original
coincidiría con el valor actual en el origen de datos y el valor de la fila Current
contendría el valor actualizado. No se asigna ningún valor a SourceVersion
para el parámetro @CompanyName
, por lo que se utiliza el valor predeterminado, el de la fila Current
.
Nota
En el caso de las operaciones Fill
de los métodos DataAdapter
y Get
de DataReader
, el tipo de .NET se deduce del tipo devuelto del proveedor de datos SqlClient de Microsoft para SQL Server. Los métodos de descriptor de acceso y los tipos de .NET deducidos para tipos de datos de Microsoft SQL Server se describen en Asignaciones de tipos de datos en ADO.NET.
Parameter.SourceColumn, Parameter.SourceVersion
SourceColumn
y SourceVersion
se pueden pasar como argumentos al constructor Parameter
, o también se pueden establecer como propiedades de un Parameter
existente. SourceColumn
es el nombre de DataColumn de DataRow en la que se recupera el valor de Parameter
. SourceVersion
especifica la versión de DataRow
que utiliza DataAdapter
para recuperar el valor.
En la tabla siguiente se muestran los valores de la enumeración DataRowVersion disponibles para su uso con SourceVersion
.
Enumeración DataRowVersion | Descripción |
---|---|
Current |
El parámetro utiliza el valor actual de la columna. Este es el valor predeterminado. |
Default |
El parámetro utiliza el DefaultValue de la columna. |
Original |
El parámetro utiliza el valor original de la columna. |
Proposed |
El parámetro utiliza un valor propuesto. |
En el ejemplo de código de SqlClient
de la siguiente sección se define un parámetro para UpdateCommand donde la columna CustomerID
se utiliza como SourceColumn
para dos parámetros: @CustomerID
(SET CustomerID = @CustomerID
) y @OldCustomerID
(WHERE CustomerID = @OldCustomerID
). El parámetro @CustomerID
se usa para actualizar la columna CustomerID al valor actual de DataRow
. Como resultado, se usa el parámetro CustomerID
SourceColumn
con un valor SourceVersion
de Current
. El parámetro @OldCustomerID
se usa para identificar la fila actual en el origen de datos. Dado que el valor de la columna coincidente se encuentra en la versión Original
de la fila, también se usa el mismo objeto SourceColumn
(CustomerID
) con SourceVersion
de Original
.
Trabajo con parámetros de SqlClient
En el ejemplo siguiente se muestra cómo crear SqlDataAdapter y establecer MissingSchemaAction en AddWithKey para recuperar información de esquema adicional de la base de datos. Las propiedades SelectCommand, InsertCommand, UpdateCommand y DeleteCommand establecen sus correspondientes objetos SqlParameter agregados a la colección Parameters. El método devuelve un objeto 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;
}