csharp,using System;,using System.Data;,using System.Data.SqlClient;class Program,{, static void Main(), {, string connectionString = "your_connection_string";, string query = "SELECT FROM your_table"; using (SqlConnection connection = new SqlConnection(connectionString)), {, SqlDataAdapter adapter = new SqlDataAdapter(query, connection);, DataSet dataSet = new DataSet();, adapter.Fill(dataSet); // Now you can work with the data in dataSet, foreach (DataRow row in dataSet.Tables[0].Rows), {, Console.WriteLine(row["your_column"]);, }, }, },},
`
这个例子展示了如何使用
SqlDataAdapter
从数据库中检索数据并填充到
DataSet`中,然后遍历并输出其中的数据。
C# 使用 SQL DataAdapter 数据适配代码实例
在C#中,SqlDataAdapter
是用于在数据源和DataSet
之间执行数据操作的桥梁,它允许你从数据库中检索数据并填充到DataTable
中,同时也可以将对DataTable
的更改解析回数据库,以下是一个完整的示例,展示了如何使用SqlDataAdapter
来执行查询、更新和删除操作。
确保你已经安装了必要的命名空间:
using System; using System.Data; using System.Data.SqlClient;
你需要一个有效的数据库连接字符串,假设我们有一个名为“TestDB”的数据库,其中包含一个名为“Employees”的表。
string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"; SqlConnection connection = new SqlConnection(connectionString);
3. 创建 DataSet 和 DataTable
DataSet dataSet = new DataSet(); DataTable dataTable = new DataTable(); dataSet.Tables.Add(dataTable);
创建一个SqlCommand
对象,定义要执行的SQL查询,然后将其传递给SqlDataAdapter
。
string selectQuery = "SELECT FROM Employees"; SqlCommand selectCommand = new SqlCommand(selectQuery, connection); SqlDataAdapter dataAdapter = new SqlDataAdapter(selectCommand);
使用Fill
方法将数据从数据库加载到DataSet
中。
try { connection.Open(); dataAdapter.Fill(dataSet, "Employees"); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } finally { connection.Close(); }
遍历DataSet
并显示数据。
foreach (DataRow row in dataSet.Tables["Employees"].Rows) { Console.WriteLine("ID: " + row["ID"] + ", Name: " + row["Name"] + ", Age: " + row["Age"]); }
假设我们要更新某条记录的年龄。
DataRow[] rows = dataSet.Tables["Employees"].Select("ID = 1"); if (rows.Length > 0) { rows[0]["Age"] = 30; // 修改年龄为30 }
为了将更改解析回数据库,我们需要配置一个UpdateCommand
。
string updateQuery = "UPDATE Employees SET Age = @Age WHERE ID = @ID"; SqlCommand updateCommand = new SqlCommand(updateQuery, connection); updateCommand.Parameters.Add("@Age", SqlDbType.Int); updateCommand.Parameters.Add("@ID", SqlDbType.Int); dataAdapter.UpdateCommand = updateCommand;
使用Update
方法将更改保存到数据库中。
int rowsAffected = dataAdapter.Update(dataSet, "Employees"); Console.WriteLine("Rows affected: " + rowsAffected);
假设我们要删除某条记录。
dataSet.Tables["Employees"].Rows.RemoveAt(0); // 删除第一条记录
同样地,我们需要配置一个DeleteCommand
。
string deleteQuery = "DELETE FROM Employees WHERE ID = @ID"; SqlCommand deleteCommand = new SqlCommand(deleteQuery, connection); deleteCommand.Parameters.Add("@ID", SqlDbType.Int); dataAdapter.DeleteCommand = deleteCommand;
使用Update
方法将删除操作保存到数据库中。
rowsAffected = dataAdapter.Update(dataSet, "Employees"); Console.WriteLine("Rows affected: " + rowsAffected);
Q1: 如果数据表中有大量数据,使用 SqlDataAdapter 是否仍然高效?
A1:SqlDataAdapter
在处理大量数据时可能会遇到性能瓶颈,因为它会一次性将所有数据加载到内存中,对于大数据量的情况,建议使用分页技术或考虑其他更高效的数据访问方式,如Entity Framework
中的懒加载或存储过程。
Q2: 如何确保在多线程环境中安全地使用 SqlDataAdapter?
A2: 在多线程环境中使用SqlDataAdapter
时,需要特别注意线程安全问题,可以使用锁机制(如lock
语句)来确保同时只有一个线程能够执行数据填充或更新操作,避免共享SqlConnection
对象,因为SqlConnection
不是线程安全的,每个线程应创建自己的SqlConnection
实例。