Delen via


DataAdapter-parameters

De DbDataAdapter eigenschap bevat vier eigenschappen die worden gebruikt om gegevens op te halen uit en bij te werken naar de gegevensbron: de SelectCommand eigenschap retourneert gegevens uit de gegevensbron, en de InsertCommand , UpdateCommanden DeleteCommand eigenschappen worden gebruikt om wijzigingen in de gegevensbron te beheren. De SelectCommand eigenschap moet worden ingesteld voordat u de Fill methode van de DataAdapter. De InsertCommand, UpdateCommandof DeleteCommand eigenschappen moeten worden ingesteld voordat de methode van de DataAdapter Update aangeroepen methode wordt aangeroepen, afhankelijk van welke wijzigingen zijn aangebracht in de gegevens in de DataTable. Als er bijvoorbeeld rijen zijn toegevoegd, moet de InsertCommand optie worden ingesteld voordat u belt Update. Wanneer Update een ingevoegde, bijgewerkte of verwijderde rij wordt verwerkt, wordt de DataAdapter betreffende Command eigenschap gebruikt om de actie te verwerken. Huidige informatie over de gewijzigde rij wordt via de Parameters verzameling doorgegeven aan het Command object.

Wanneer u een rij bijwerkt in de gegevensbron, roept u de UPDATE-instructie aan, die een unieke id gebruikt om de rij in de tabel te identificeren die moet worden bijgewerkt. De unieke id is doorgaans de waarde van een primaire-sleutelveld. De UPDATE-instructie maakt gebruik van parameters die zowel de unieke id als de kolommen en waarden bevatten die moeten worden bijgewerkt, zoals wordt weergegeven in de volgende Transact-SQL-instructie.

UPDATE Customers SET CompanyName = @CompanyName
  WHERE CustomerID = @CustomerID  

Notitie

De syntaxis voor tijdelijke aanduidingen voor parameters is afhankelijk van de gegevensbron. In dit voorbeeld ziet u tijdelijke aanduidingen voor een SQL Server-gegevensbron. Gebruik tijdelijke aanduidingen voor vraagtekens (?) voor System.Data.OleDb en System.Data.Odbc parameters.

In dit Visual Basic-voorbeeld wordt het CompanyName veld bijgewerkt met de waarde van de @CompanyName parameter voor de rij waar CustomerID gelijk is aan de waarde van de @CustomerID parameter. De parameters halen informatie op uit de gewijzigde rij met behulp van de SourceColumn eigenschap van het SqlParameter object. Hier volgen de parameters voor de vorige update-instructie. In de code wordt ervan uitgegaan dat de variabele adapter een geldig SqlDataAdapter object vertegenwoordigt.

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  

De Add methode van de Parameters verzameling neemt de naam van de parameter, het gegevenstype, de grootte (indien van toepassing op het type) en de naam van de SourceColumn parameter van de DataTable. U ziet dat de SourceVersion @CustomerID parameter is ingesteld op Original. Dit garandeert dat de bestaande rij in de gegevensbron wordt bijgewerkt als de waarde van de identificerende kolom of kolommen in de gewijzigde DataRowkolom is gewijzigd. In dat geval komt de Original rijwaarde overeen met de huidige waarde in de gegevensbron en bevat de Current rijwaarde de bijgewerkte waarde. De SourceVersion parameter voor de @CompanyName parameter is niet ingesteld en gebruikt de standaardwaarde van Current de rij.

Notitie

Voor zowel de Fill bewerkingen van de DataAdapter als de Get methoden van de DataReader.NET Framework wordt het .NET Framework-type afgeleid van het type dat wordt geretourneerd door de .NET Framework-gegevensprovider. De uitgestelde .NET Framework-typen en accessormethoden voor Microsoft SQL Server-, OLE DB- en ODBC-gegevenstypen worden beschreven in gegevenstypetoewijzingen in ADO.NET.

Parameter.SourceColumn, Parameter.SourceVersion

De SourceColumn en SourceVersion kunnen worden doorgegeven als argumenten aan de Parameter constructor of worden ingesteld als eigenschappen van een bestaande Parameter. Dit SourceColumn is de naam van de DataColumn DataRow waaruit de waarde van de Parameter waarde wordt opgehaald. Hiermee SourceVersion geeft u de DataRow versie op die wordt DataAdapter gebruikt om de waarde op te halen.

In de volgende tabel ziet u de DataRowVersion opsommingswaarden die beschikbaar zijn voor gebruik met SourceVersion.

Opsomming DataRowVersion Beschrijving
Current De parameter gebruikt de huidige waarde van de kolom. Dit is de standaardinstelling.
Default De parameter maakt gebruik van de DefaultValue kolom.
Original De parameter gebruikt de oorspronkelijke waarde van de kolom.
Proposed De parameter maakt gebruik van een voorgestelde waarde.

In SqlClient het codevoorbeeld in de volgende sectie wordt een parameter gedefinieerd voor een UpdateCommand parameter waarin de CustomerID kolom wordt gebruikt als een SourceColumn voor twee parameters: @CustomerID (SET CustomerID = @CustomerID) en @OldCustomerID (WHERE CustomerID = @OldCustomerID). De @CustomerID parameter wordt gebruikt om de kolom CustomerID bij te werken naar de huidige waarde in de DataRow. Als gevolg hiervan wordt de CustomerID SourceColumn met een SourceVersion van Current gebruikt. De @OldCustomerID parameter wordt gebruikt om de huidige rij in de gegevensbron te identificeren. Omdat de overeenkomende kolomwaarde wordt gevonden in de Original versie van de rij, wordt hetzelfde SourceColumn (CustomerID) met een SourceVersion van Original gebruikt.

Werken met SqlClient-parameters

In het volgende voorbeeld ziet u hoe u een SqlDataAdapter en stel deze AddWithKey MissingSchemaAction in om aanvullende schemagegevens op te halen uit de database. De SelectCommandeigenschappenset , InsertCommanden DeleteCommand UpdateCommandeigenschappen en de bijbehorende SqlParameter objecten die aan de Parameters verzameling zijn toegevoegd. De methode retourneert een SqlDataAdapter object.

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

Tijdelijke aanduidingen voor OleDb-parameters

Voor de OleDbDataAdapter en OdbcDataAdapter objecten moet u tijdelijke aanduidingen voor vraagtekens (?) gebruiken om de parameters te identificeren.

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 geparameteriseerde queryinstructies definiƫren welke invoer- en uitvoerparameters moeten worden gemaakt. Als u een parameter wilt maken, gebruikt u de Parameters.Add methode of de Parameter constructor om de kolomnaam, het gegevenstype en de grootte op te geven. Voor intrinsieke gegevenstypen, zoals Integer, hoeft u de grootte niet op te nemen of kunt u de standaardgrootte opgeven.

In het volgende codevoorbeeld worden de parameters voor een SQL-instructie gemaakt en wordt vervolgens een DataSet.

OleDb-voorbeeld

' 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-parameters

' 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");  

Notitie

Als er geen parameternaam wordt opgegeven voor een parameter, krijgt de parameter een incrementele standaardnaam van parameterN, te beginnen met 'Parameter1'. We raden u aan de naamconventie parameterN te vermijden wanneer u een parameternaam opgeeft, omdat de naam die u opgeeft, mogelijk conflicteert met een bestaande standaardparameternaam in de ParameterCollection. Als de opgegeven naam al bestaat, wordt er een uitzondering gegenereerd.

Zie ook