Parametry elementu DataAdapter

Obiekt DbDataAdapter ma cztery właściwości używane do pobierania danych ze źródła danych i aktualizowania ich do źródła danych: SelectCommand właściwość zwraca dane ze źródła danych, a właściwości , UpdateCommandi InsertCommand służą DeleteCommand do zarządzania zmianami w źródle danych. Właściwość musi zostać ustawiona SelectCommand przed wywołaniem Fill metody DataAdapter. Właściwości InsertCommand, UpdateCommandlub DeleteCommand należy ustawić przed Update wywołaniem metody , DataAdapter w zależności od zmian w danych w obiekcie DataTable. Jeśli na przykład dodano wiersze, należy ustawić element InsertCommand przed wywołaniem metody Update. Podczas Update przetwarzania wstawionego, zaktualizowanego lub usuniętego wiersza DataAdapter obiekt używa odpowiedniej Command właściwości do przetworzenia akcji. Bieżące informacje o zmodyfikowanym wierszu są przekazywane do Command obiektu za pośrednictwem kolekcji Parameters .

Podczas aktualizowania wiersza w źródle danych należy wywołać instrukcję UPDATE, która używa unikatowego identyfikatora do identyfikowania wiersza w tabeli do zaktualizowania. Unikatowy identyfikator jest zazwyczaj wartością pola klucza podstawowego. Instrukcja UPDATE używa parametrów, które zawierają zarówno unikatowy identyfikator, jak i kolumny i wartości do zaktualizowania, jak pokazano w poniższej instrukcji Języka Transact-SQL.

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

Uwaga

Składnia symboli zastępczych parametrów zależy od źródła danych. W tym przykładzie przedstawiono symbole zastępcze dla źródła danych programu SQL Server. Użyj symboli zastępczych znaku zapytania (?) dla System.Data.OleDb parametrów i System.Data.Odbc .

W tym przykładzie języka Visual Basic pole jest aktualizowane przy użyciu wartości @CompanyName parametru dla wiersza, CompanyName w którym CustomerID jest równa wartości parametru@CustomerID. Parametry pobierają informacje z zmodyfikowanego wiersza przy użyciu SourceColumn właściwości SqlParameter obiektu. Poniżej przedstawiono parametry poprzedniej przykładowej instrukcji UPDATE. W kodzie przyjęto założenie, że zmienna adapter reprezentuje prawidłowy SqlDataAdapter obiekt.

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  

Metoda AddParameters kolekcji przyjmuje nazwę parametru, typ danych, rozmiar (jeśli ma zastosowanie do typu) i nazwę SourceColumn elementu z DataTableklasy . Zwróć uwagę, że SourceVersion parametr jest @CustomerID ustawiony na Originalwartość . Gwarantuje to, że istniejący wiersz w źródle danych zostanie zaktualizowany, jeśli wartość identyfikującej kolumnę lub kolumny została zmieniona w zmodyfikowanym DataRowobiekcie . W takim przypadku Original wartość wiersza będzie zgodna z bieżącą wartością w źródle danych, a Current wartość wiersza będzie zawierać zaktualizowaną wartość. Parametr SourceVersion dla parametru @CompanyName nie jest ustawiony i używa domyślnej Current wartości wiersza.

Uwaga

W przypadku operacji FillDataAdapter i Get metod DataReaderprogramu , typ programu .NET Framework jest wnioskowany z typu zwróconego przez dostawcę danych programu .NET Framework. Wywnioskowane typy i metody dostępu programu .NET Framework dla typów danych MICROSOFT SQL Server, OLE DB i ODBC są opisane w temacie Mapowania typów danych w ADO.NET.

Parameter.SourceColumn, Parameter.SourceVersion

Element SourceColumn i SourceVersion może być przekazywany jako argumenty do konstruktora Parameter lub ustawiany jako właściwości istniejącego Parameterobiektu . Jest SourceColumn to nazwa DataColumn obiektu , z DataRow którego zostanie pobrana wartość Parameter . Parametr SourceVersion określa DataRow wersję używaną DataAdapter do pobrania wartości.

W poniższej DataRowVersion tabeli przedstawiono wartości wyliczenia dostępne do użycia z SourceVersionprogramem .

DataRowVersion, wyliczenie opis
Current Parametr używa bieżącej wartości kolumny. Jest to opcja domyślna.
Default Parametr używa DefaultValue kolumny .
Original Parametr używa oryginalnej wartości kolumny.
Proposed Parametr używa proponowanej wartości.

Przykład SqlClient kodu w następnej sekcji definiuje parametr dla kolumny UpdateCommand , w której kolumna CustomerID jest używana jako SourceColumn dla dwóch parametrów: @CustomerID (SET CustomerID = @CustomerID) i @OldCustomerID (WHERE CustomerID = @OldCustomerID). Parametr @CustomerID służy do aktualizowania kolumny CustomerID do bieżącej wartości w elemencie DataRow. W rezultacie używany jest element CustomerIDSourceColumn z wartością SourceVersionCurrent . Parametr @OldCustomerID służy do identyfikowania bieżącego wiersza w źródle danych. Ponieważ zgodna wartość kolumny znajduje się w Original wersji wiersza, jest używana ta sama SourceColumn wartość (CustomerID) z wartością Original .SourceVersion

Praca z parametrami sqlclient

W poniższym przykładzie pokazano, jak utworzyć element SqlDataAdapter i ustawić MissingSchemaAction parametr na AddWithKey , aby pobrać dodatkowe informacje o schemacie z bazy danych. Zestaw SelectCommandwłaściwości , InsertCommand, UpdateCommandi DeleteCommand oraz odpowiadające SqlParameter im obiekty dodane do kolekcji Parameters . Metoda zwraca SqlDataAdapter obiekt.

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

Symbole zastępcze parametrów OleDb

OleDbDataAdapter W przypadku obiektów i OdbcDataAdapter należy użyć symboli zastępczych znaku zapytania (?), aby zidentyfikować parametry.

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 = ?";  

Sparametryzowane instrukcje zapytania definiują, które parametry wejściowe i wyjściowe należy utworzyć. Aby utworzyć parametr, użyj Parameters.Add metody lub konstruktora Parameter , aby określić nazwę kolumny, typ danych i rozmiar. W przypadku typów danych wewnętrznych, takich jak Integer, nie trzeba uwzględniać rozmiaru lub można określić rozmiar domyślny.

Poniższy przykład kodu tworzy parametry instrukcji SQL, a następnie wypełnia DataSetelement .

Przykład oledb

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

Parametry odbc

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

Uwaga

Jeśli nazwa parametru nie jest podana dla parametru, parametr otrzymuje przyrostową domyślną nazwę parametruN, zaczynając od parametru "Parameter1". Zalecamy unikanie konwencji nazewnictwa parametruN podczas podawania nazwy parametru, ponieważ podana nazwa może powodować konflikt z istniejącą domyślną nazwą parametru ParameterCollectionw pliku . Jeśli podana nazwa już istnieje, zostanie zgłoszony wyjątek.

Zobacz też