DataAdapter-parametrar
DbDataAdapter Har fyra egenskaper som används för att hämta data från och uppdatera data till datakällan: SelectCommand egenskapen returnerar data från datakällan och InsertCommand egenskaperna , UpdateCommandoch DeleteCommand används för att hantera ändringar i datakällan. Egenskapen SelectCommand
måste anges innan du anropar Fill
metoden för DataAdapter
. Egenskaperna InsertCommand
, UpdateCommand
, eller DeleteCommand
måste anges innan Update
metoden DataAdapter
anropas, beroende på vilka ändringar som har gjorts i data i DataTable. Om rader till exempel har lagts till InsertCommand
måste du ange innan du anropar Update
. När Update
bearbetar en infogad, uppdaterad eller borttagen DataAdapter
rad använder respektive Command
egenskap för att bearbeta åtgärden. Aktuell information om den ändrade raden skickas till Command
objektet via Parameters
samlingen.
När du uppdaterar en rad i datakällan anropar du UPDATE-instruktionen, som använder en unik identifierare för att identifiera raden i tabellen som ska uppdateras. Den unika identifieraren är vanligtvis värdet för ett primärnyckelfält. UPDATE-instruktionen använder parametrar som innehåller både den unika identifieraren och de kolumner och värden som ska uppdateras, enligt följande Transact-SQL-instruktion.
UPDATE Customers SET CompanyName = @CompanyName
WHERE CustomerID = @CustomerID
Kommentar
Syntaxen för parameterplatshållare beror på datakällan. I det här exemplet visas platshållare för en SQL Server-datakälla. Använd platshållare för frågetecken (?) för System.Data.OleDb och System.Data.Odbc parametrar.
I det här Visual Basic-exemplet CompanyName
uppdateras fältet med värdet för parametern @CompanyName
för raden där CustomerID
är lika med värdet för parametern @CustomerID
. Parametrarna hämtar information från den ändrade raden med hjälp SourceColumn av objektets SqlParameter egenskap. Följande är parametrarna för föregående exempel på UPDATE-instruktionen. Koden förutsätter att variabeln adapter
representerar ett giltigt SqlDataAdapter objekt.
adapter.Parameters.Add( _
"@CompanyName", SqlDbType.NChar, 15, "CompanyName")
Dim parameter As SqlParameter = _
adapter.UpdateCommand.Parameters.Add("@CustomerID", _
SqlDbType.NChar, 5, "CustomerID")
parameter.SourceVersion = DataRowVersion.Original
Metoden Add
för Parameters
samlingen tar namnet på parametern, datatypen, storleken (om tillämpligt för typen) och namnet på SourceColumn från DataTable
. Observera att parametern SourceVersion är inställd på @CustomerID
Original
. Detta garanterar att den befintliga raden i datakällan uppdateras om värdet för den identifierande kolumnen eller kolumnerna har ändrats i den ändrade DataRow. I så fall Original
skulle radvärdet matcha det aktuella värdet i datakällan, och Current
radvärdet skulle innehålla det uppdaterade värdet. Parametern SourceVersion
@CompanyName
för har inte angetts och använder standardvärdet rad Current
.
Kommentar
För både Fill
åtgärderna DataAdapter
för och Get
metoderna DataReader
för , härleds .NET Framework-typen från den typ som returneras från .NET Framework-dataprovidern. De härledda .NET Framework-typerna och åtkomstmetoderna för Microsoft SQL Server-, OLE DB- och ODBC-datatyper beskrivs i Datatypmappningar i ADO.NET.
Parameter.SourceColumn, Parameter.SourceVersion
Och SourceColumn
SourceVersion
kan skickas som argument till Parameter
konstruktorn eller anges som egenskaper för en befintlig Parameter
. SourceColumn
är namnet DataColumn på från där DataRow värdet för Parameter
kommer att hämtas. SourceVersion
Anger vilken DataRow
version som DataAdapter
används för att hämta värdet.
I följande tabell visas de DataRowVersion uppräkningsvärden som är tillgängliga för användning med SourceVersion
.
DataRowVersion-uppräkning | beskrivning |
---|---|
Current |
Parametern använder det aktuella värdet för kolumnen. Det här är standardinställningen. |
Default |
Parametern använder DefaultValue kolumnens. |
Original |
Parametern använder det ursprungliga värdet för kolumnen. |
Proposed |
Parametern använder ett föreslaget värde. |
Kodexemplet SqlClient
i nästa avsnitt definierar en parameter för en UpdateCommand där CustomerID
kolumnen används som en SourceColumn
för två parametrar: @CustomerID
(SET CustomerID = @CustomerID
) och @OldCustomerID
(WHERE CustomerID = @OldCustomerID
). Parametern @CustomerID
används för att uppdatera kolumnen CustomerID till det aktuella värdet i DataRow
. Som ett resultat CustomerID
SourceColumn
används med en SourceVersion
av Current
. Parametern @OldCustomerID
används för att identifiera den aktuella raden i datakällan. Eftersom det matchande kolumnvärdet finns i Original
radens version används samma SourceColumn
(CustomerID
) med en SourceVersion
av Original
.
Arbeta med SqlClient-parametrar
I följande exempel visas hur du skapar en SqlDataAdapter och anger MissingSchemaAction till AddWithKey för att hämta ytterligare schemainformation från databasen. Egenskapsuppsättningen , , och samt motsvarande SqlParameter objekt som lagts till i Parameters samlingen.DeleteCommand UpdateCommandInsertCommandSelectCommand Metoden returnerar ett SqlDataAdapter
objekt.
public static SqlDataAdapter CreateSqlDataAdapter(SqlConnection connection)
{
SqlDataAdapter adapter = new()
{
MissingSchemaAction = MissingSchemaAction.AddWithKey,
// Create the commands.
SelectCommand = new SqlCommand(
"SELECT CustomerID, CompanyName FROM CUSTOMERS", connection),
InsertCommand = new SqlCommand(
"INSERT INTO Customers (CustomerID, CompanyName) " +
"VALUES (@CustomerID, @CompanyName)", connection),
UpdateCommand = new SqlCommand(
"UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
"WHERE CustomerID = @oldCustomerID", connection),
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;
}
Public Function CreateSqlDataAdapter( _
ByVal connection As SqlConnection) As SqlDataAdapter
Dim adapter As 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
End Function
Platshållare för OleDb-parameter
För objekten OleDbDataAdapter och OdbcDataAdapter måste du använda platshållare för frågetecken (?) för att identifiera parametrarna.
Dim selectSQL As String = _
"SELECT CustomerID, CompanyName FROM Customers " & _
"WHERE CountryRegion = ? AND City = ?"
Dim insertSQL AS String = _
"INSERT INTO Customers (CustomerID, CompanyName) VALUES (?, ?)"
Dim updateSQL AS String = _
"UPDATE Customers SET CustomerID = ?, CompanyName = ? " & _
WHERE CustomerID = ?"
Dim deleteSQL As String = "DELETE FROM Customers WHERE CustomerID = ?"
string selectSQL =
"SELECT CustomerID, CompanyName FROM Customers " +
"WHERE CountryRegion = ? AND City = ?";
string insertSQL =
"INSERT INTO Customers (CustomerID, CompanyName) " +
"VALUES (?, ?)";
string updateSQL =
"UPDATE Customers SET CustomerID = ?, CompanyName = ? " +
"WHERE CustomerID = ? ";
string deleteSQL = "DELETE FROM Customers WHERE CustomerID = ?";
De parametriserade frågeinstruktionerna definierar vilka indata- och utdataparametrar som måste skapas. Om du vill skapa en parameter använder du Parameters.Add
metoden eller Parameter
konstruktorn för att ange kolumnnamnet, datatypen och storleken. För inbyggda datatyper, till exempel Integer
, behöver du inte inkludera storleken, eller så kan du ange standardstorleken.
I följande kodexempel skapas parametrarna för en SQL-instruktion och fyller sedan i en DataSet
.
OleDb-exempel
' Assumes that connection is a valid OleDbConnection object.
Dim adapter As OleDbDataAdapter = New OleDbDataAdapter
Dim selectCMD AS OleDbCommand = New OleDbCommand(selectSQL, connection)
adapter.SelectCommand = selectCMD
' Add parameters and set values.
selectCMD.Parameters.Add( _
"@CountryRegion", OleDbType.VarChar, 15).Value = "UK"
selectCMD.Parameters.Add( _
"@City", OleDbType.VarChar, 15).Value = "London"
Dim customers As DataSet = New DataSet
adapter.Fill(customers, "Customers")
// Assumes that connection is a valid OleDbConnection object.
OleDbDataAdapter adapter = new OleDbDataAdapter();
OleDbCommand selectCMD = new OleDbCommand(selectSQL, connection);
adapter.SelectCommand = selectCMD;
// Add parameters and set values.
selectCMD.Parameters.Add(
"@CountryRegion", OleDbType.VarChar, 15).Value = "UK";
selectCMD.Parameters.Add(
"@City", OleDbType.VarChar, 15).Value = "London";
DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");
Odbc-parametrar
' Assumes that connection is a valid OdbcConnection object.
Dim adapter As OdbcDataAdapter = New OdbcDataAdapter
Dim selectCMD AS OdbcCommand = New OdbcCommand(selectSQL, connection)
adapter.SelectCommand = selectCMD
' Add Parameters and set values.
selectCMD.Parameters.Add("@CountryRegion", OdbcType.VarChar, 15).Value = "UK"
selectCMD.Parameters.Add("@City", OdbcType.VarChar, 15).Value = "London"
Dim customers As DataSet = New DataSet
adapter.Fill(customers, "Customers")
// Assumes that connection is a valid OdbcConnection object.
OdbcDataAdapter adapter = new OdbcDataAdapter();
OdbcCommand selectCMD = new OdbcCommand(selectSQL, connection);
adapter.SelectCommand = selectCMD;
//Add Parameters and set values.
selectCMD.Parameters.Add("@CountryRegion", OdbcType.VarChar, 15).Value = "UK";
selectCMD.Parameters.Add("@City", OdbcType.VarChar, 15).Value = "London";
DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");
Kommentar
Om ett parameternamn inte anges för en parameter får parametern ett inkrementellt standardnamn för ParameterN , som börjar med "Parameter1". Vi rekommenderar att du undviker namngivningskonventionen för parameterN när du anger ett parameternamn, eftersom namnet som du anger kan vara i konflikt med ett befintligt standardparameternamn i ParameterCollection
. Om det angivna namnet redan finns genereras ett undantag.