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

相关推荐
一点事1 小时前
ruoyi:集成mybatisplus实现mybatis增强
java·开发语言·mybatis
你的冰西瓜1 小时前
C++14 新特性详解:相较于 C++11 的主要改进
开发语言·c++·stl
linksinke1 小时前
Mapstruct引发的 Caused by: java.lang.NumberFormatException: For input string: ““
java·开发语言·exception·mapstruct·numberformat·不能为空
无限进步_1 小时前
C语言单向链表实现详解:从基础操作到完整测试
c语言·开发语言·数据结构·c++·算法·链表·visual studio
好好研究2 小时前
SpringMVC框架 - 异常处理
java·开发语言·spring·mvc
h***93662 小时前
【MySQL数据库】Ubuntu下的mysql
数据库·mysql·ubuntu
songroom2 小时前
Rust: 量化策略回测与简易线程池构建(MPMC)
开发语言·后端·rust
摇滚侠2 小时前
Vue 项目实战《尚医通》,完成确定挂号业务,笔记46
java·开发语言·javascript·vue.js·笔记
正在走向自律2 小时前
豆包编程模型Doubao-Seed-Code深度体验,从零开始构建全栈项目的完整指南
java·服务器·数据库·doubao·claude code·火山方舟