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

相关推荐
走粥20 小时前
使用indexOf查找对象结合Pinia持久化引发的问题
开发语言·前端·javascript
廋到被风吹走20 小时前
【MySql】超时问题分析
java·数据库·mysql
csbysj202020 小时前
Python break 语句详解
开发语言
Y0011123620 小时前
Day10-MySQL-事物
数据库·sql·mysql
轩情吖20 小时前
MySQL之用户管理
数据库·c++·后端·mysql·权限管理·用户管理
2401_8579182921 小时前
C++中的访问者模式实战
开发语言·c++·算法
格林威21 小时前
工业相机图像高速存储(C++版):RAID 0 NVMe SSD 阵列暴力提速,附海康实战代码!
开发语言·c++·人工智能·数码相机·计算机视觉·工业相机·堡盟相机
零雲21 小时前
java面试:Spring事务失效的场景有哪些?
java·数据库·面试
elseif12321 小时前
CSP-S提高级大纲
开发语言·数据结构·c++·笔记·算法·大纲·考纲
wenlonglanying21 小时前
mysql之联合索引
数据库·mysql