ADO.NET DataAdaptors
DataAdaptors are a fundamental component of ADO.NET, serving as a bridge between a data source (like a database) and a DataSet or DataTable. They are responsible for retrieving data from a data source and populating a DataSet, as well as handling the synchronization of changes made in the DataSet back to the data source.
Key Responsibilities of DataAdaptors:
- Retrieving Data: Executing SQL queries or stored procedures to fetch data.
- Populating Datasets: Filling a DataSet or DataTable with the retrieved data.
- Updating Data: Applying changes (inserts, updates, deletes) made to a DataSet back to the original data source.
- Managing Data States: Tracking the state of rows (added, modified, deleted) within a DataSet.
Common DataAdaptor Classes:
ADO.NET provides specific DataAdapter classes for different data providers:
Class Name | Description |
---|---|
SqlDataAdapter |
For SQL Server databases. |
OracleDataAdapter |
For Oracle databases. |
OdbcDataAdapter |
For data sources accessible via ODBC. |
OleDbDataAdapter |
For data sources accessible via OLE DB. |
Core Methods and Properties:
SelectCommand
: ACommand
object that retrieves records from the data source.InsertCommand
,UpdateCommand
,DeleteCommand
:Command
objects used to perform data modification operations.Fill(DataSet)
: Populates aDataSet
with the results of theSelectCommand
.Update(DataSet)
: Commits all changes in theDataSet
to the data source.FillSchema(DataSet, SchemaType)
: Retrieves database schema information and creates tables within theDataSet
to match the schema of the data source.
Example Usage: Retrieving Data
The following example demonstrates how to use a SqlDataAdapter
to retrieve data from a SQL Server database into a DataSet
.
using System;
using System.Data;
using System.Data.SqlClient;
public class DataAdapterExample
{
public static void Main(string[] args)
{
string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
string query = "SELECT CustomerID, CompanyName, ContactName FROM Customers";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(query, connection);
DataSet dataSet = new DataSet();
try
{
connection.Open();
adapter.Fill(dataSet, "Customers"); // Fill the DataSet with data into a DataTable named "Customers"
Console.WriteLine("Customer Data:");
foreach (DataRow row in dataSet.Tables["Customers"].Rows)
{
Console.WriteLine($"ID: {row["CustomerID"]}, Name: {row["CompanyName"]}, Contact: {row["ContactName"]}");
}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
}
}
Example Usage: Updating Data
Updating data involves modifying the DataSet
and then using the Update
method of the DataAdapter
. You need to define InsertCommand
, UpdateCommand
, and DeleteCommand
for this to work effectively.
using System;
using System.Data;
using System.Data.SqlClient;
public class DataAdapterUpdateExample
{
public static void Main(string[] args)
{
string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
string query = "SELECT CustomerID, CompanyName, ContactName FROM Customers WHERE CustomerID = @CustomerID"; // Example with parameter
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(query, connection);
// Define UPDATE command
adapter.UpdateCommand = new SqlCommand(
"UPDATE Customers SET CompanyName = @CompanyName, ContactName = @ContactName WHERE CustomerID = @CustomerID", connection);
adapter.UpdateCommand.Parameters.Add("@CompanyName", SqlDbType.VarChar, 50, "CompanyName");
adapter.UpdateCommand.Parameters.Add("@ContactName", SqlDbType.VarChar, 50, "ContactName");
adapter.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.Int, 4, "CustomerID");
// Define INSERT command (example, requires more setup for real scenarios)
adapter.InsertCommand = new SqlCommand(
"INSERT INTO Customers (CustomerID, CompanyName, ContactName) VALUES (@CustomerID, @CompanyName, @ContactName)", connection);
adapter.InsertCommand.Parameters.Add("@CustomerID", SqlDbType.Int, 4, "CustomerID");
adapter.InsertCommand.Parameters.Add("@CompanyName", SqlDbType.VarChar, 50, "CompanyName");
adapter.InsertCommand.Parameters.Add("@ContactName", SqlDbType.VarChar, 50, "ContactName");
// Define DELETE command (example)
adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);
adapter.DeleteCommand.Parameters.Add("@CustomerID", SqlDbType.Int, 4, "CustomerID");
DataSet dataSet = new DataSet();
SqlParameter parameter = new SqlParameter("@CustomerID", SqlDbType.Int);
parameter.Value = 1; // Specify which customer to load
adapter.SelectCommand.Parameters.Add(parameter);
try
{
connection.Open();
adapter.Fill(dataSet, "Customers");
if (dataSet.Tables["Customers"].Rows.Count > 0)
{
// Modify data
DataRow row = dataSet.Tables["Customers"].Rows[0];
row["CompanyName"] = "Acme Corporation Inc.";
row["ContactName"] = "John Smith";
// Apply changes back to the database
int rowsAffected = adapter.Update(dataSet, "Customers");
Console.WriteLine($"{rowsAffected} row(s) updated successfully.");
}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
}
}
DataAdaptors are crucial for disconnected data scenarios, allowing applications to fetch data, allow user modifications, and then persist those changes efficiently. Understanding their role and how to configure them properly is key to effective data management in .NET applications.