Modyfikowanie danych za pomocą obiektu DbDataAdapter
Metoda CreateDataAdapter DbProviderFactory obiektu daje DbDataAdapter obiekt, który jest silnie typizowane dla bazowego dostawcy danych określonego w czasie tworzenia fabryki. Następnie możesz użyć polecenia DbCommandBuilder , aby utworzyć polecenia wstawiania, aktualizowania i usuwania danych ze DataSet źródła danych.
Pobieranie danych za pomocą elementu DbDataAdapter
W tym przykładzie pokazano, jak utworzyć silnie typizowane DbDataAdapter
na podstawie nazwy dostawcy i parametry połączenia. Kod używa CreateConnection metody metody DbProviderFactory , aby utworzyć DbConnectionelement . Następnie kod używa CreateCommand metody , aby utworzyć DbCommand element , aby wybrać dane, ustawiając jego CommandText
właściwości i Connection
. Na koniec kod tworzy DbDataAdapter obiekt przy użyciu CreateDataAdapter metody i ustawia jego SelectCommand
właściwość. Metoda Fill
ładowania DbDataAdapter
danych do obiektu DataTable.
static void CreateDataAdapter(string providerName, string connectionString)
{
try
{
// Create the DbProviderFactory and DbConnection.
DbProviderFactory factory =
DbProviderFactories.GetFactory(providerName);
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = connectionString;
using (connection)
{
// Define the query.
const string queryString =
"SELECT CategoryName FROM Categories";
// Create the DbCommand.
DbCommand command = factory.CreateCommand();
command.CommandText = queryString;
command.Connection = connection;
// Create the DbDataAdapter.
DbDataAdapter adapter = factory.CreateDataAdapter();
adapter.SelectCommand = command;
// Fill the DataTable.
DataTable table = new();
adapter.Fill(table);
// Display each row and column value.
foreach (DataRow row in table.Rows)
{
foreach (DataColumn column in table.Columns)
{
Console.WriteLine(row[column]);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Shared Sub CreateDataAdapter(ByVal providerName As String, _
ByVal connectionString As String)
' Create the DbProviderFactory and DbConnection.
Try
Dim factory As DbProviderFactory = _
DbProviderFactories.GetFactory(providerName)
Dim connection As DbConnection = _
factory.CreateConnection()
connection.ConnectionString = connectionString
Using connection
' Define the query.
Dim queryString As String = _
"SELECT CategoryName FROM Categories"
'Create the DbCommand.
Dim command As DbCommand = _
factory.CreateCommand()
command.CommandText = queryString
command.Connection = connection
' Create the DbDataAdapter.
Dim adapter As DbDataAdapter = _
factory.CreateDataAdapter()
adapter.SelectCommand = command
' Fill the DataTable
Dim table As New DataTable
adapter.Fill(table)
'Display each row and column value.
Dim row As DataRow
Dim column As DataColumn
For Each row In table.Rows
For Each column In table.Columns
Console.WriteLine(row(column))
Next
Next
End Using
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
Modyfikowanie danych za pomocą obiektu DbDataAdapter
W tym przykładzie pokazano, jak zmodyfikować dane w DataTable
obiekcie przy użyciu DbDataAdapter klasy , aby DbCommandBuilder wygenerować polecenia wymagane do aktualizowania danych w źródle danych. Właściwość SelectCommand jest DbDataAdapter
ustawiona na pobieranie identyfikatorów CustomerID i CompanyName z tabeli Customers. Metoda GetInsertCommand służy do ustawiania InsertCommand właściwości , GetUpdateCommand metoda jest używana do ustawiania UpdateCommand właściwości, a GetDeleteCommand metoda jest używana do ustawiania DeleteCommand właściwości. Kod dodaje nowy wiersz do tabeli Customers i aktualizuje źródło danych. Następnie kod lokalizuje dodany wiersz, wyszukując identyfikator CustomerID, który jest kluczem podstawowym zdefiniowanym dla tabeli Customers. Zmienia nazwę firmy i aktualizuje źródło danych. Na koniec kod usuwa wiersz.
static void CreateDataAdapter(string providerName, string connectionString)
{
try
{
// Create the DbProviderFactory and DbConnection.
DbProviderFactory factory =
DbProviderFactories.GetFactory(providerName);
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = connectionString;
using (connection)
{
// Define the query.
const string queryString =
"SELECT CustomerID, CompanyName FROM Customers";
// Create the select command.
DbCommand command = factory.CreateCommand();
command.CommandText = queryString;
command.Connection = connection;
// Create the DbDataAdapter.
DbDataAdapter adapter = factory.CreateDataAdapter();
adapter.SelectCommand = command;
// Create the DbCommandBuilder.
DbCommandBuilder builder = factory.CreateCommandBuilder();
builder.DataAdapter = adapter;
// Get the insert, update and delete commands.
adapter.InsertCommand = builder.GetInsertCommand();
adapter.UpdateCommand = builder.GetUpdateCommand();
adapter.DeleteCommand = builder.GetDeleteCommand();
// Display the CommandText for each command.
Console.WriteLine("InsertCommand: {0}",
adapter.InsertCommand.CommandText);
Console.WriteLine("UpdateCommand: {0}",
adapter.UpdateCommand.CommandText);
Console.WriteLine("DeleteCommand: {0}",
adapter.DeleteCommand.CommandText);
// Fill the DataTable.
DataTable table = new();
adapter.Fill(table);
// Insert a new row.
DataRow newRow = table.NewRow();
newRow["CustomerID"] = "XYZZZ";
newRow["CompanyName"] = "XYZ Company";
table.Rows.Add(newRow);
adapter.Update(table);
// Display rows after insert.
Console.WriteLine();
Console.WriteLine("----List All Rows-----");
foreach (DataRow row in table.Rows)
{
Console.WriteLine("{0} {1}", row[0], row[1]);
}
Console.WriteLine("----After Insert-----");
// Edit an existing row.
DataRow[] editRow = table.Select("CustomerID = 'XYZZZ'");
editRow[0]["CompanyName"] = "XYZ Corporation";
adapter.Update(table);
// Display rows after update.
Console.WriteLine();
foreach (DataRow row in table.Rows)
{
Console.WriteLine("{0} {1}", row[0], row[1]);
}
Console.WriteLine("----After Update-----");
// Delete a row.
DataRow[] deleteRow = table.Select("CustomerID = 'XYZZZ'");
foreach (DataRow row in deleteRow)
{
row.Delete();
}
adapter.Update(table);
// Display rows after delete.
Console.WriteLine();
foreach (DataRow row in table.Rows)
{
Console.WriteLine("{0} {1}", row[0], row[1]);
}
Console.WriteLine("----After Delete-----");
Console.WriteLine("Customer XYZZZ was deleted.");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Shared Sub CreateDataAdapter(ByVal providerName As String, _
ByVal connectionString As String)
' Create the DbProviderFactory and DbConnection.
Try
Dim factory As DbProviderFactory = _
DbProviderFactories.GetFactory(providerName)
Dim connection As DbConnection = _
factory.CreateConnection()
connection.ConnectionString = connectionString
Using connection
' Define the query.
Dim queryString As String = _
"SELECT CustomerID, CompanyName FROM Customers"
'Create the select command.
Dim command As DbCommand = _
factory.CreateCommand()
command.CommandText = queryString
command.Connection = connection
' Create the DbDataAdapter.
Dim adapter As DbDataAdapter = _
factory.CreateDataAdapter()
adapter.SelectCommand = command
' Create the DbCommandBuilder.
Dim builder As DbCommandBuilder = _
factory.CreateCommandBuilder()
builder.DataAdapter = adapter
' Get the insert, update and delete commands.
adapter.InsertCommand = builder.GetInsertCommand()
adapter.UpdateCommand = builder.GetUpdateCommand()
adapter.DeleteCommand = builder.GetDeleteCommand()
' Display the CommandText for each command.
Console.WriteLine("InsertCommand: {0}", _
adapter.InsertCommand.CommandText)
Console.WriteLine("UpdateCommand: {0}", _
adapter.UpdateCommand.CommandText)
Console.WriteLine("DeleteCommand: {0}", _
adapter.DeleteCommand.CommandText)
' Fill the DataTable
Dim table As New DataTable
adapter.Fill(table)
' Insert a new row.
Dim newRow As DataRow = table.NewRow
newRow("CustomerID") = "XYZZZ"
newRow("CompanyName") = "XYZ Company"
table.Rows.Add(newRow)
adapter.Update(table)
' Display rows after insert.
Console.WriteLine()
Console.WriteLine("----List All Rows-----")
Dim row As DataRow
For Each row In table.Rows
Console.WriteLine("{0} {1}", row(0), row(1))
Next
Console.WriteLine("----After Insert-----")
' Edit an existing row.
Dim editRow() As DataRow = _
table.Select("CustomerID = 'XYZZZ'")
editRow(0)("CompanyName") = "XYZ Corporation"
adapter.Update(table)
' Display rows after update.
Console.WriteLine()
For Each row In table.Rows
Console.WriteLine("{0} {1}", row(0), row(1))
Next
Console.WriteLine("----After Update-----")
' Delete a row.
Dim deleteRow() As DataRow = _
table.Select("CustomerID = 'XYZZZ'")
For Each row In deleteRow
row.Delete()
Next
adapter.Update(table)
table.AcceptChanges()
' Display each row and column value after delete.
Console.WriteLine()
For Each row In table.Rows
Console.WriteLine("{0} {1}", row(0), row(1))
Next
Console.WriteLine("----After Delete-----")
Console.WriteLine("Customer XYZZZ was deleted.")
End Using
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
Obsługa parametrów
Dostawcy danych programu .NET Framework obsługują nazewnictwo i określanie parametrów i symboli zastępczych parametrów w inny sposób. Ta składnia jest dostosowana do określonego źródła danych, zgodnie z opisem w poniższej tabeli.
Dostawca danych | Składnia nazewnictwa parametrów |
---|---|
SqlClient |
Używa nazwanych parametrów w formacie @ nazwa_parametru. |
OracleClient |
Używa nazwanych parametrów w formacie : parmname (lub parmname). |
OleDb |
Używa znaczników parametrów pozycyjnych wskazywanych przez znak zapytania (? ). |
Odbc |
Używa znaczników parametrów pozycyjnych wskazywanych przez znak zapytania (? ). |
Model fabryki nie jest przydatny do tworzenia sparametryzowanych DbCommand
i DbDataAdapter
obiektów. Musisz rozgałęzić w kodzie, aby utworzyć parametry dostosowane do dostawcy danych.
Ważne
Całkowite unikanie parametrów specyficznych dla dostawcy przy użyciu łączenia ciągów w celu konstruowania bezpośrednich instrukcji SQL nie jest zalecane ze względów bezpieczeństwa. Używanie łączenia ciągów zamiast parametrów pozostawia aplikację podatną na ataki polegających na wstrzyknięciu kodu SQL.