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å @CustomerIDOriginal. 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 DataReaderfö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 SourceColumnSourceVersion 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 CustomerIDSourceColumn 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.DeleteCommandUpdateCommandInsertCommandSelectCommand 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, med början "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.

Se även