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
, UpdateCommand
of 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.