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

相关推荐
福大大架构师每日一题13 小时前
redis 8.8.0 发布:新数据结构、字段级通知、INCREX、XNACK 全面升级,8.6 到 8.8 变化一文看懂
数据结构·数据库·redis
游乐码13 小时前
unity基础(八)协程
游戏·unity·c#·游戏引擎
Xin_ye1008613 小时前
C# 零基础到精通教程 - 第十六章:ASP.NET Core Web API——构建现代 Web 服务
开发语言·c#
basketball61613 小时前
Go语言介绍
开发语言·go
霸道流氓气质13 小时前
Spring Data JPA 完全指南
开发语言·数据库
Demon1_Coder13 小时前
Day4-LangChain4j-向量数据库-检索增强RAG
数据库
phltxy13 小时前
RabbitMQ 应用问题
数据库·分布式·rabbitmq
星晨雪海13 小时前
基于 SpringBoot + Redis (Lettuce) + RabbitMQ 实现「Redis 预扣库存 + 异步同步数据库」
数据库·spring boot·java-rabbitmq
mosaic_born13 小时前
centos 7.9 离线部署Zabbix 6.0.46 监控详细方案(解决数据库字符集问题)
数据库·centos·zabbix
weelinking13 小时前
【产品】10_搭建前端框架——把你的原型变成真实页面
java·大数据·前端·数据库·人工智能·python·前端框架