Gegevens wijzigen met een DbDataAdapter
De CreateDataAdapter methode van een DbProviderFactory object geeft u een DbDataAdapter object dat sterk is getypt op de onderliggende gegevensprovider die is opgegeven op het moment dat u de factory maakt. Vervolgens kunt u een DbCommandBuilder opdracht maken om gegevens in te voegen, bij te werken en te verwijderen uit een DataSet gegevensbron.
Gegevens ophalen met een DbDataAdapter
In dit voorbeeld ziet u hoe u een sterk getypte DbDataAdapter
naam maakt op basis van een providernaam en verbindingsreeks. De code maakt gebruik van de CreateConnection methode van het DbProviderFactory maken van een DbConnection. Vervolgens gebruikt de code de CreateCommand methode om een DbCommand gegevens te maken om gegevens te selecteren door de CommandText
bijbehorende en Connection
eigenschappen in te stellen. Ten slotte maakt de code een DbDataAdapter object met behulp van de CreateDataAdapter methode en stelt de eigenschap ervan in SelectCommand
. De Fill
methode van het DbDataAdapter
laden van de gegevens in een 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
Gegevens wijzigen met een DbDataAdapter
In dit voorbeeld ziet u hoe u gegevens in een DataTable
met behulp van een DbDataAdapter wijzigt met behulp van een DbCommandBuilder om de opdrachten te genereren die nodig zijn voor het bijwerken van gegevens in de gegevensbron. De SelectCommand set DbDataAdapter
is ingesteld om de CustomerID en CompanyName op te halen uit de tabel Klanten. De GetInsertCommand methode wordt gebruikt om de InsertCommand eigenschap in te stellen, de GetUpdateCommand methode wordt gebruikt om de UpdateCommand eigenschap in te stellen en de GetDeleteCommand methode wordt gebruikt om de DeleteCommand eigenschap in te stellen. De code voegt een nieuwe rij toe aan de tabel Klanten en werkt de gegevensbron bij. De code zoekt vervolgens de toegevoegde rij door te zoeken op de CustomerID. Dit is de primaire sleutel die is gedefinieerd voor de tabel Klanten. De companyname wordt gewijzigd en de gegevensbron wordt bijgewerkt. Ten slotte verwijdert de code de rij.
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
Parameters verwerken
De .NET Framework-gegevensproviders verwerken de naamgeving en het opgeven van parameters en tijdelijke aanduidingen voor parameters anders. Deze syntaxis is afgestemd op een specifieke gegevensbron, zoals beschreven in de volgende tabel.
Gegevensprovider | Naamgevingsyntaxis van parameters |
---|---|
SqlClient |
Maakt gebruik van benoemde parameters in de indelingsparameternaam@ . |
OracleClient |
Gebruikt benoemde parameters in de notatie : parmname (of parmname). |
OleDb |
Gebruikt positionele parametermarkeringen die worden aangegeven met een vraagteken (? ). |
Odbc |
Gebruikt positionele parametermarkeringen die worden aangegeven met een vraagteken (? ). |
Het factory-model is niet handig voor het maken van parameters DbCommand
en DbDataAdapter
objecten. U moet vertakken in uw code om parameters te maken die zijn afgestemd op uw gegevensprovider.
Belangrijk
Het helemaal vermijden van providerspecifieke parameters door tekenreekssamenvoeging te gebruiken om directe SQL-instructies te maken, wordt niet aanbevolen om beveiligingsredenen. Door tekenreekssamenvoeging te gebruiken in plaats van parameters, blijft uw toepassing kwetsbaar voor SQL-injectieaanvallen.