SqlConnection、SqlCommand 和 SqlDataAdapter

文章目录

在C#中, SqlConnectionSqlCommand SqlDataAdapterADO.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();
    // 执行数据库操作...
}

主要功能:

  1. 管理数据库连接

  2. 开启和关闭连接

  3. 处理连接池

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 - 用于断开式数据操作和数据绑定

相关推荐
老华带你飞2 分钟前
二手商城|基于springboot 二手商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
@小码农4 分钟前
6547网:2025年9月 Python等级考试(三级)真题及答案
服务器·数据库·python
哆啦A梦158813 分钟前
商城后台管理系统 06 Mock.js模拟数据
开发语言·javascript·ecmascript
毕设源码-郭学长15 分钟前
【开题答辩全过程】以 基于Java高考志愿填报推荐系统为例,包含答辩的问题和答案
java·开发语言·高考
老华带你飞18 分钟前
酒店预约|基于springboot 酒店预约系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
程序员-King.23 分钟前
【Qt开源项目】— ModbusScope-day 4
开发语言·qt
j_hy26 分钟前
OOP组件及事件处理(一)
java·开发语言
南棱笑笑生29 分钟前
20251215给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通typeC1接口
linux·c语言·开发语言·rockchip
会飞的土拨鼠呀35 分钟前
如何查询MySQL的CPU使用率突然变高
数据库·mysql
想用offer打牌43 分钟前
一站式了解数据库三大范式(库表设计基础)
数据库·后端·面试