Freigeben über


Verwenden von Parametern mit einem DataAdapter

Das DataAdapter-Objekt besitzt vier Eigenschaften, mit denen Daten aus der Datenquelle abgerufen und Daten in der Datenquelle aktualisiert werden. Mit der SelectCommand-Eigenschaft werden Daten aus der Datenquelle zurückgegeben. Mit den Eigenschaften InsertCommand, UpdateCommand und DeleteCommand werden Änderungen in der Datenquelle verwaltet. Für die SelectCommand-Eigenschaft muss ein Wert festgelegt werden, bevor die Fill-Methode des DataAdapter-Objekts aufgerufen wird. Für die Eigenschaften InsertCommand, UpdateCommand oder DeleteCommand muss ein Wert festgelegt werden, bevor die Update-Methode des DataAdapter-Objekts aufgerufen wird, je nachdem, welche Änderungen an den Daten im DataSet vorgenommen wurden. Wenn beispielsweise Zeilen hinzugefügt wurden, muss ein Wert für die InsertCommand-Eigenschaft festgelegt werden. Erst dann kann die Update-Methode aufgerufen werden. Wenn mit der Update-Methode eine eingefügte, aktualisierte oder gelöschte Zeile verarbeitet wird, verwendet das DataAdapter-Objekt die entsprechende Command-Eigenschaft zur Verarbeitung der Aktion. Aktuelle Informationen zur geänderten Zeile werden über die Parameters-Auflistung an das Command-Objekt übergeben.

Wenn Sie beispielsweise eine Zeile in der Datenquelle aktualisieren, rufen Sie die UPDATE-Anweisung auf, die einen eindeutigen Bezeichner verwendet, um die zu aktualisierende Zeile in der Tabelle anzugeben. Der eindeutige Bezeichner ist in der Regel der Wert eines Primärschlüsselfeldes. Die UPDATE-Anweisung verwendet Parameter, die sowohl den eindeutigen Bezeichner als auch die zu aktualisierenden Spalten und Werte enthalten, wie in der folgenden SQL-Anweisung gezeigt.

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

In diesem Beispiel wird das CompanyName-Feld mit dem Wert des @CompanyName-Parameters aktualisiert, und zwar in der Zeile, in der CustomerID dem Wert des @CustomerID-Parameters entspricht. Die Parameter rufen mit der SourceColumn-Eigenschaft des Parameter-Objekts Informationen aus der geänderten Zeile ab. Im Folgenden sehen Sie die Parameter für die vorhergehende UPDATE-Beispielanweisung.

custDA.Parameters.Add("@CompanyName", SqlDbType.NChar, 15, "CompanyName")
Dim myParm As SqlParameter = custDA.UpdateCommand.Parameters.Add("@CustomerID", _
                                              SqlDbType.NChar, 5, "CustomerID")
myParm.SourceVersion = DataRowVersion.Original

Die Add-Methode der Parameters-Auflistung verwendet den Namen des Parameters, den DataAdapter-spezifischen Typ, die Größe (sofern für den Typ zutreffend) und den Namen der SourceColumn aus der DataTable. Beachten Sie, dass als SourceVersion für den @CustomerID-Parameter der Wert Original festgelegt wurde. Dadurch wird sichergestellt, dass die in der Datenquelle vorhandene Zeile aktualisiert wird, wenn der Wert der gekennzeichneten Spalte(n) in der bearbeiteten DataRow geändert wurde. In diesem Fall entspricht der Original-Zeilenwert dem aktuellen Wert in der Datenquelle und der Current-Zeilenwert enthält den aktualisierten Wert. Die SourceVersion des @CompanyName-Parameters ist nicht angegeben. Daher wird der Standardwert in der Current-Zeile verwendet.

Der folgende Code enthält SQL-Beispielanweisungen, die als CommandText für die Eigenschaften SelectCommand, InsertCommand, UpdateCommand und DeleteCommand des DataAdapter-Objekts verwendet werden. Für das OleDbDataAdapter-Objekt und das OdbcDataAdapter-Objekt müssen Sie Fragezeichenplatzhalter (?) zur Identifizierung der Parameter verwenden. Für das SqlDataAdapter-Objekt müssen Sie benannte Parameter verwenden.

SqlClient

Dim selectSQL As String = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = @Country AND City = @City"
Dim insertSQL As String = "INSERT INTO Customers (CustomerID, CompanyName) " & _
                          "VALUES (@CustomerID, @CompanyName)"

Dim updateSQL As String = "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " & _
                          "WHERE CustomerID = @OldCustomerID"

Dim deleteSQL As String = "DELETE FROM Customers WHERE CustomerID = @CustomerID"
[C#]
string selectSQL = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = @Country AND City = @City";
string insertSQL = "INSERT INTO Customers (CustomerID, CompanyName) " +
                   "VALUES (@CustomerID, @CompanyName)";

string updateSQL = "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
                   "WHERE CustomerID = @OldCustomerID";

string deleteSQL = "DELETE FROM Customers WHERE CustomerID = @CustomerID";

OleDb oder Odbc

Dim selectSQL As String = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? 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 = ?"
[C#]
string selectSQL = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? 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 = ?";

Die parametrisierten Abfrageanweisungen definieren, welche Eingabe- und Ausgabeparameter erstellt werden müssen. Zur Erstellung eines Parameters verwenden Sie die Parameters.Add-Methode oder den Parameter-Konstruktor, um Spaltenname, Datentyp und Größe anzugeben. Für systeminterne Datentypen wie Integer müssen Sie die Größe nicht angeben. Sie können auch die Standardgröße angeben.

Das folgende Codebeispiel erstellt die Parameter für die SQL-Anweisung aus dem vorhergehenden Beispiel und füllt ein DataSet.

SqlClient

Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind")
Dim custDA As SqlDataAdapter = New SqlDataAdapter

Dim selectCMD AS SqlCommand = New SqlCommand(selectSQL, nwindConn)
custDA.SelectCommand = selectCMD

' Add parameters and set values.
selectCMD.Parameters.Add("@Country", SqlDbType.NVarChar, 15).Value = "UK"
selectCMD.Parameters.Add("@City", SqlDbType.NVarChar, 15).Value = "London"

Dim custDS As DataSet = New DataSet
custDA.Fill(custDS, "Customers")
[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");
SqlDataAdapter custDA = new SqlDataAdapter();         

SqlCommand selectCMD = new SqlCommand(selectSQL, nwindConn);
custDA.SelectCommand = selectCMD;

// Add parameters and set values.
selectCMD.Parameters.Add("@Country", SqlDbType.NVarChar, 15).Value = "UK";
selectCMD.Parameters.Add("@City", SqlDbType.NVarChar, 15).Value = "London";

DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");

OleDb

Dim nwindConn As OleDbConnection = New OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;" & _
                                                       "Integrated Security=SSPI;Initial Catalog=northwind")
Dim custDA As OleDbDataAdapter = New OleDbDataAdapter 

Dim selectCMD AS OleDbCommand = New OleDbCommand(selectSQL, nwindConn)
custDA.SelectCommand = selectCMD

' Add parameters and set values.
selectCMD.Parameters.Add("@Country", OleDbType.VarChar, 15).Value = "UK"
selectCMD.Parameters.Add("@City", OleDbType.VarChar, 15).Value = "London"

Dim custDS As DataSet = New DataSet
custDA.Fill(custDS, "Customers")
[C#]
OleDbConnection nwindConn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;" +
                                                "Integrated Security=SSPI;Initial Catalog=northwind;");
OleDbDataAdapter custDA = new OleDbDataAdapter();

OleDbCommand selectCMD = new OleDbCommand(selectSQL, nwindConn);
custDA.SelectCommand = selectCMD;

// Add parameters and set values.
selectCMD.Parameters.Add("@Country", OleDbType.VarChar, 15).Value = "UK";
selectCMD.Parameters.Add("@City", OleDbType.VarChar, 15).Value = "London";

DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");

Odbc

Dim nwindConn As OdbcConnection = New OdbcConnection("Driver={SQL Server};Server=localhost;" & _
                                                     "Trusted_Connection=yes;Database=northwind")
Dim custDA As OdbcDataAdapter = New OdbcDataAdapter

Dim selectCMD AS OdbcCommand = New OdbcCommand(selectSQL, nwindConn)
custDA.SelectCommand = selectCMD

' Add Parameters and set values.
selectCMD.Parameters.Add("@Country", OdbcType.VarChar, 15).Value = "UK"
selectCMD.Parameters.Add("@City", OdbcType.VarChar, 15).Value = "London"

Dim custDS As DataSet = New DataSet
custDA.Fill(custDS, "Customers")
[C#]
OdbcConnection nwindConn = new OdbcConnection("Driver={SQL Server};Server=localhost;" +
                                              "Trusted_Connection=yes;Database=northwind;");
OdbcDataAdapter custDA = new OdbcDataAdapter();

OdbcCommand selectCMD = new OdbcCommand(selectSQL, nwindConn);
custDA.SelectCommand = selectCMD;

//Add Parameters and set values.
selectCMD.Parameters.Add("@Country", OdbcType.VarChar, 15).Value = "UK";
selectCMD.Parameters.Add("@City", OdbcType.VarChar, 15).Value = "London";

DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");

Hinweis   Wenn für einen Parameter kein Parametername angegeben wird, erhält der Parameter standardmäßig den Namen ParameterN, beginnend mit "Parameter1", der jeweils um eins erhöht wird. Sie sollten die Benennungskonvention "ParameterN" bei der Angabe eines Parameternamens vermeiden, da der angegebene Name u. U. zu einem Konflikt mit einem vorhandenen Standardparameternamen in ParameterCollection führen kann. Wenn der angegebene Name bereits vorhanden ist, wird eine Ausnahme ausgelöst.

Parameter.DbType

Jeder .NET Framework-Datenprovider verwendet eigene Parametertypen. Wenn Sie den Typ angeben, wird der Parameter-Wert in den .NET Framework-Datenprovidertyp konvertiert, bevor er an die Datenquelle übergeben wird. Wird kein Typ angegeben, leitet ADO.NET den .NET Framework-Datenprovidertyp für Parameter vom .NET Framework-Typ ab, der für den Value des Parameter-Objekts angegeben ist.

Sie können den Parameter-Typ auch allgemein angeben, indem Sie die DbType-Eigenschaft des Parameter-Objekts auf einen bestimmten System.Data.DbType festlegen. Außerdem leitet ADO.NET den .NET Framework-Datenprovidertyp für einen Parameter vom DbType des Parameter-Objekts ab.

Der .NET Framework-Datenprovidertyp eines Parameter-Objekts wird vom .NET Framework-Typ für den Value des Parameter-Objekts oder vom DbType des Parameter-Objekts hergeleitet. Die folgende Tabelle zeigt den hergeleiteten Parameter-Typ auf der Grundlage des als Parameter-Wert weitergegebenen Objekts oder des angegebenen DbType.

.NET Framework-Typ System.Data.DbType SqlDbType OleDbType OdbcType OracleType
bool Boolean Bit Boolean Bit Byte
byte Byte TinyInt UnsignedTinyInt TinyInt Byte
byte[] Binary VarBinary. Diese implizite Konvertierung schlägt fehl, wenn das Bytearray größer als die maximale Größe von VarBinary (8000 Bytes) ist. Für Bytearrays, die größer als 8000 Bytes sind, müssen Sie SqlDbType explizit festlegen. VarBinary Binary Raw
char     Die Herleitung von SqlDbType aus char wird nicht unterstützt. Char Char Byte
DateTime DateTime DateTime DBTimeStamp DateTime DateTime
Decimal Decimal Decimal Decimal Numeric Number
double Double Float Double Double Double
float Single Real Single Real Float
Guid Guid UniqueIdentifier Guid UniqueIdentifier Raw
Int16 Int16 SmallInt SmallInt SmallInt Int16
Int32 Int32 Int Int Int Int32
Int64 Int64 BitInt BigInt BigInt Number
object Object Variant Variant Die Herleitung von OdbcType aus Object wird nicht unterstützt. Blob
string String NVarChar. Diese implizite Konvertierung schlägt fehl, wenn die Zeichenfolge größer als die maximale Größe von NVarChar (4000 Zeichen) ist. Für Zeichenfolgen, die mehr als 4000 Zeichen haben, müssen Sie SqlDbType explizit festlegen. VarWChar NVarChar NVarChar
TimeSpan Time Die Herleitung von SqlDbType aus TimeSpan wird nicht unterstützt. DBTime Time DateTime
UInt16 UInt16 Die Herleitung von SqlDbType aus UInt16 wird nicht unterstützt. UnsignedSmallInt Int UInt16
UInt32 UInt32 Die Herleitung von SqlDbType aus UInt32 wird nicht unterstützt. UnsignedInt BigInt UInt32
UInt64 UInt64 Die Herleitung von SqlDbType aus UInt64 wird nicht unterstützt. UnsignedBigInt Numeric Number
    AnsiString VarChar VarChar VarChar VarChar
    AnsiStringFixedLength Char Char Char Char
Currency Money Currency Die Herleitung von OdbcType aus Currency wird nicht unterstützt. Number
    Date Die Herleitung von SqlType aus Date wird nicht unterstützt. DBDate Date DateTime
    SByte Die Herleitung von SqlType aus SByte wird nicht unterstützt. TinyInt Die Herleitung von OdbcType aus SByte wird nicht unterstützt. SByte
    StringFixedLength NChar WChar NChar NChar
    Time Die Herleitung von SqlType aus Time wird nicht unterstützt. DBTime Time DateTime
    VarNumeric Die Herleitung von SqlDbType aus VarNumeric wird nicht unterstützt. VarNumeric Die Herleitung von OdbcType aus VarNumeric wird nicht unterstützt. Number

Hinweis   Die .NET Framework-Datenprovider, die zum Lieferumfang von .NET Framework, Version 1.0, gehören, überprüfen nicht die Werte Precision und Scale von Decimal-Parameterwerten. Dies kann u. U. dazu führen, dass in der Datenquelle verkürzte Werte eingefügt werden. Wenn Sie .NET Framework, Version 1.0, verwenden, überprüfen Sie vor der Festlegung des Parameterwertes Precision und Scale der Decimal-Werte.

Für .NET Framework, Version 1.1 oder höher, wird eine Ausnahme ausgelöst, wenn ein Decimal-Parameterwert mit einem unzulässigen Precision-Wert festgelegt wird. Scale-Werte, die die Dezimalstellen des Decimal-Parameters übersteigen, werden weiterhin abgekürzt.

Parameter.Direction

Die folgende Tabelle zeigt die Werte, die Sie für die ParameterDirection-Enumeration verwenden können, um die Direction für den Parameter festzulegen.

Membername Beschreibung
Input Der Parameter ist ein Eingabeparameter. Dies ist die Standardeinstellung.
InputOutput Der Parameter kann sowohl für die Eingabe als auch für die Ausgabe verwendet werden.
Output Der Parameter ist ein Ausgabeparameter.
ReturnValue Der Parameter stellt einen Rückgabewert dar.

Das folgende Codebeispiel zeigt, wie Sie die Direction für den Parameter festlegen.

myParm.Direction = ParameterDirection.Output

Parameter.SourceColumn, Parameter.SourceVersion

SourceColumn und SourceVersion können als Argumente an den Parameter-Konstruktor übergeben oder als Eigenschaften eines vorhandenen Parameters festgelegt werden. SourceColumn ist der Name der DataColumn der DataRow, aus der der Parameter-Wert abgerufen wird. SourceVersion gibt an, welche DataRow-Version das DataAdapter-Objekt zum Abrufen des Wertes verwendet.

Die folgende Tabelle zeigt die DataRowVersion-Enumerationswerte, die mit SourceVersion verwendet werden können.

Membername Beschreibung
Current Der Parameter verwendet den aktuellen Wert der Spalte. Dies ist die Standardeinstellung.
Default Der Parameter verwendet den Standardwert der Spalte.
Original Der Parameter verwendet den Ausgangswert der Spalte.
Proposed Der Parameter verwendet einen vorgeschlagenen Wert.

Das folgende Codebeispiel definiert eine UPDATE-Anweisung, in der die CustomerID-Spalte als SourceColumn für zwei Parameter verwendet wird: @CustomerID (SET CustomerID = @CustomerID) und @OldCustomerID (WHERE CustomerID = @OldCustomerID). Mit dem @CustomerID-Parameter wird die CustomerID-Spalte auf den aktuellen Wert in der DataRow aktualisiert. Entsprechend wird die CustomerID SourceColumn mit einer SourceVersion von Current verwendet. Mit dem @OldCustomerID-Parameter wird die aktuelle Zeile in der Datenquelle identifiziert. Da der entsprechende Spaltenwert in der Original-Version der Zeile ermittelt wird, wird dieselbe SourceColumn (CustomerID) mit einer SourceVersion von Original verwendet.

SqlClient

custDA.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID")

custDA.UpdateCommand.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName")

Dim myParm As SqlParameter = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", _
                               SqlDbType.NChar, 5, "CustomerID")
myParm.SourceVersion = DataRowVersion.Original
[C#]
custDA.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");

custDA.UpdateCommand.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");

SqlParameter myParm = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", SqlDbType.NChar, 5, "CustomerID");
myParm.SourceVersion = DataRowVersion.Original;

OleDb

custDA.UpdateCommand.Parameters.Add("@CustomerID", OleDbType.Char, 5,"CustomerID")

custDA.UpdateCommand.Parameters.Add("@CompanyName", OleDbType.VarChar, 40, "CompanyName")

Dim myParm As OleDbParameter = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", _
                                 OleDbType.Char, 5, "CustomerID")
myParm.SourceVersion = DataRowVersion.Original
[C#]
custDA.UpdateCommand.Parameters.Add("@CustomerID", OleDbType.Char, 5, "CustomerID");

custDA.UpdateCommand.Parameters.Add("@CompanyName", OleDbType.VarChar, 40, "CompanyName");

OleDbParameter myParm = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", OleDbType.Char, 5, "CustomerID");
myParm.SourceVersion = DataRowVersion.Original;

Odbc

custDA.UpdateCommand.Parameters.Add("@CustomerID", OdbcType.Char, 5, "CustomerID")

custDA.UpdateCommand.Parameters.Add("@CompanyName", OdbcType.VarChar, 40, "CompanyName")

Dim myParm As OdbcParameter = custDA.UpdateCommand.Parameters.Add("@oldCustomerID", _
                              OdbcType.Char, 5, "CustomerID")
myParm.SourceVersion = DataRowVersion.Original
[C#]
custDA.UpdateCommand.Parameters.Add("@CustomerID", OdbcType.Char, 5, "CustomerID");

custDA.UpdateCommand.Parameters.Add("@CompanyName", OdbcType.VarChar, 40, "CompanyName");

OdbcParameter myParm = custDA.UpdateCommand.Parameters.Add("@oldCustomerID", OdbcType.Char, 5, "CustomerID");
myParm.SourceVersion = DataRowVersion.Original;

UpdatedRowSource

Mit der UpdatedRowSource-Eigenschaft des Command-Objekts können Sie steuern, wie die Werte, die von der Datenquelle zurückgegeben werden, wieder dem DataSet zugeordnet werden. Wenn Sie für die UpdatedRowSource-Eigenschaft einen der UpdateRowSource-Enumerationswerte angeben, legen Sie fest, ob Parameter, die vom DataAdapter-Befehl zurückgegeben werden, ignoriert oder auf die geänderte Zeile im DataSet angewendet werden. Darüber hinaus können Sie angeben, ob die erste zurückgegebene Zeile (falls vorhanden) auf die geänderte Zeile im DataSet angewendet wird.

In der folgenden Tabelle werden die unterschiedlichen Werte der UpdateRowSource-Enumeration beschrieben und wie sie das Verhalten eines Befehls beeinflussen, der mit einem DataAdapter-Objekt verwendet wird.

UpdateRowSource Beschreibung
Both Sowohl die Ausgabeparameter als auch die erste Zeile eines zurückgegebenen Resultsets können der geänderten Zeile im DataSet zugeordnet werden.
FirstReturnedRecord Nur die Daten in der ersten Zeile eines zurückgegebenen Resultsets können der geänderten Zeile im DataSet zugeordnet werden.
None Alle Ausgabeparameter oder Zeilen eines zurückgegebenen Resultsets werden ignoriert.
OutputParameters Nur Ausgabeparameter können der geänderten Zeile im DataSet zugeordnet werden.

Siehe auch

Datenzugriff mit .NET Framework-Datenprovidern | Verwenden von gespeicherten Prozeduren mit einem Befehl | DataRowVersion-Enumeration | OleDbDataAdapter-Klasse | OdbcDataAdapter-Klasse | ParameterDirection-Enumeration | SqlDataAdapter-Klasse