文章目录
- 1、SqlConnection
- 2、SqlCommand
- 3、SqlDataAdapter
- 4、主要区别
- 5、场景对比
-
- [5.1 连接式数据访问(SqlCommand)](#5.1 连接式数据访问(SqlCommand))
- [5.2 断开式数据访问(SqlDataAdapter)](#5.2 断开式数据访问(SqlDataAdapter))
- [5.3 综合示例](#5.3 综合示例)
在C#中, SqlConnection、 SqlCommand 和 SqlDataAdapter 是 ADO.NET 中用于操作 SQL Server 数据库的核心组件。
简单来说:
-
SqlConnection:负责数据库连接。
-
SqlCommand:负责执行具体的SQL命令。
-
SqlDataAdapter:是一个适配器,它内部使用SqlCommand和SqlConnection来执行命令,并提供了与DataSet/DataTable之间的桥梁。
1、SqlConnection
-
作用:用于建立与SQL Server数据库的连接。它表示一个到数据库的开放连接。
-
使用:在使用前需要提供连接字符串(Connection String),然后通过Open方法打开连接,使用完成后需要调用Close方法关闭连接,或者使用using语句自动管理连接。
csharp
using System.Data.SqlClient;
// 创建连接字符串
string connectionString = "Server=myServer;Database=myDB;User Id=myUser;Password=myPassword;";
// 创建并打开连接
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 执行数据库操作...
}
主要功能:
-
管理数据库连接
-
开启和关闭连接
-
处理连接池
2、SqlCommand
- 作用:用于对数据库执行一个SQL语句或存储过程。它可以通过SqlConnection来执行命令,命令可以是增删改查(INSERT、DELETE、UPDATE、SELECT)等。
csharp
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 创建命令对象
using (SqlCommand command = new SqlCommand("SELECT * FROM Users WHERE Id = @Id", connection))
{
// 添加参数
command.Parameters.AddWithValue("@Id", 1);
// 执行查询
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["UserName"]);
}
}
}
}
-
使用:可以设置CommandText属性来指定SQL语句或存储过程名,设置Connection属性为已打开的SqlConnection实例。然后根据命令类型,使用ExecuteNonQuery(用于非查询命令,返回受影响的行数)、ExecuteScalar(返回第一行第一列的值)或ExecuteReader(返回一个SqlDataReader对象,用于读取查询结果)等方法执行命令。
-
主要方法
-
ExecuteNonQuery() - 执行不返回数据的命令(INSERT, UPDATE, DELETE)
-
ExecuteReader() - 执行查询并返回 DataReader
-
ExecuteScalar() - 执行查询并返回第一行第一列
-
3、SqlDataAdapter
- 作用:用于从数据库检索数据并填充到DataSet或DataTable中,也可以将DataSet或DataTable中的更改更新回数据库。它是对SqlCommand和SqlConnection的封装,简化了数据操作。
csharp
using (SqlConnection connection = new SqlConnection(connectionString))
{
// 创建DataAdapter
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Users", connection);
// 自动生成Insert、Update、Delete命令
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
DataSet dataSet = new DataSet();
// 填充DataSet
adapter.Fill(dataSet, "Users");
// 修改数据...
dataSet.Tables["Users"].Rows[0]["UserName"] = "NewName";
// 更新回数据库
adapter.Update(dataSet, "Users");
}
- 使用:通过SelectCommand、InsertCommand、UpdateCommand、DeleteCommand属性设置相应的SqlCommand对象,然后调用Fill方法将数据填充到DataSet/DataTable,调用Update方法将DataSet/DataTable中的更改保存到数据库。
4、主要区别
| 组件 | 作用 | 使用场景 | 数据访问方式 |
|---|---|---|---|
| SqlConnection | 数据库连接管理 | 所有数据库操作的基础 | 不直接操作数据 |
| SqlCommand | 执行SQL命令 | 直接执行SQL语句、存储过程 | 连接式访问 |
| SqlDataAdapter | 数据适配器 | 离线数据操作、数据绑定 | 断开式访问 |
5、场景对比
5.1 连接式数据访问(SqlCommand)
csharp
// 适合:快速读取、单次操作、实时数据
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("UPDATE Products SET Price = @Price WHERE Id = @Id", conn))
{
cmd.Parameters.AddWithValue("@Price", 99.99);
cmd.Parameters.AddWithValue("@Id", 1);
int rowsAffected = cmd.ExecuteNonQuery();
}
}
5.2 断开式数据访问(SqlDataAdapter)
csharp
// 适合:复杂数据处理、数据绑定、批量操作
DataSet ds = new DataSet();
using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Products", connectionString))
{
adapter.Fill(ds, "Products");
// 离线处理数据
foreach (DataRow row in ds.Tables["Products"].Rows)
{
row["Price"] = (decimal)row["Price"] * 1.1m; // 涨价10%
}
// 批量更新回数据库
adapter.Update(ds, "Products");
}
5.3 综合示例
csharp
public class UserRepository
{
private string connectionString;
public UserRepository(string connString)
{
connectionString = connString;
}
// 使用SqlCommand执行查询
public User GetUserById(int id)
{
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand("SELECT * FROM Users WHERE Id = @Id", connection))
{
command.Parameters.AddWithValue("@Id", id);
connection.Open();
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
return new User
{
Id = (int)reader["Id"],
UserName = reader["UserName"].ToString(),
Email = reader["Email"].ToString()
};
}
}
}
return null;
}
// 使用SqlDataAdapter获取所有用户
public DataTable GetAllUsers()
{
var dataTable = new DataTable();
using (var adapter = new SqlDataAdapter("SELECT * FROM Users", connectionString))
{
adapter.Fill(dataTable);
}
return dataTable;
}
}
总结:
-
SqlConnection - 基础连接组件
-
SqlCommand - 用于直接执行SQL命令
-
SqlDataAdapter - 用于断开式数据操作和数据绑定