使用 C 连接与操作 SQL Server 数据库完全指南

admin
本指南详解C语言连接与操作SQL Server数据库的全流程:涵盖环境配置(安装SQL Server Native Client及开发工具)、连接字符串构建(含服务器、数据库、认证方式参数),通过ODBC/ADO.NET接口实现数据库连接;重点讲解执行SQL命令(查询、增删改)的方法,包括结果集读取、参数化查询防注入,以及事务管理与异常处理技巧;最后强调资源释放(关闭连接、释放对象)及连接池优化等注意事项,助开发者高效实现C与SQL Server的数据交互。

在 .NET 开发中,C# 是最主流的编程语言之一,而 SQL Server 则是企业级关系型数据库的常用选择,掌握 C# 与 SQL Server 的交互方法,是开发数据驱动应用的核心技能,本文将从环境准备、连接数据库、基础数据操作(增删改查)、事务处理到高级特性(如存储过程调用),逐步讲解如何使用 C# 高效操作 SQL Server 数据库。

环境准备

在开始编码前,需确保以下环境已配置完成:

开发工具

  • Visual Studio:推荐使用 Visual Studio 2019 或更高版本(支持 .NET Core/.NET 5+)。
  • SQL Server:安装 SQL Server 实例(如 SQL Server 2019 Express,免费版即可满足开发需求)。
  • 数据库管理工具:可选 SQL Server Management Studio(SSMS),用于管理数据库和测试 SQL 语句。

NuGet 包引用

C# 操作 SQL Server 主要依赖 System.Data.SqlClient 命名空间,该库已包含在 .NET 框架中(.NET Framework 和 .NET Core 均支持),若通过 NuGet 管理,可执行以下命令:

使用 C 连接与操作 SQL Server 数据库完全指南

Install-Package System.Data.SqlClient

连接 SQL Server 数据库

连接字符串格式

连接字符串是 C# 应用与 SQL Server 建立连接的“桥梁”,包含服务器地址、数据库名、认证方式等信息,常见格式如下:

Windows 认证(推荐,无需用户名密码)

string connectionString = "Server=服务器名;Database=数据库名;Integrated Security=True;";
  • 服务器名:本地数据库可写 localhost 或 ;远程数据库需写 IP 地址或计算机名。
  • 数据库名:要连接的数据库实例名称。
  • Integrated Security=True:使用 Windows 当前用户身份认证。

SQL Server 认证(需用户名密码)

string connectionString = "Server=服务器名;Database=数据库名;User Id=用户名;Password=密码;";

建立与释放连接

使用 SqlConnection 类管理数据库连接,需注意及时释放资源(通过 using 语句自动释放,避免内存泄漏)。

using System;
using System.Data.SqlClient;
class DatabaseConnection
{
    static void Main()
    {
        string connectionString = "Server=localhost;Database=TestDB;Integrated Security=True;";
        try
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                Console.WriteLine("数据库连接成功!");
                // 此处可执行数据库操作
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"连接失败:{ex.Message}");
        }
    }
}

基础数据操作(增删改查)

查询数据(Select)

使用 SqlCommand 执行 SQL 查询语句,通过 SqlDataReader 读取结果集(适用于大量数据,逐行读取,内存效率高)。

示例:查询用户表数据

假设数据库中有一张 Users 表(结构:Id int, Name nvarchar(50), Age int),查询所有用户信息:

using System;
using System.Data.SqlClient;
class QueryData
{
    static void Main()
    {
        string connectionString = "Server=localhost;Database=TestDB;Integrated Security=True;";
        string sql = "SELECT Id, Name, Age FROM Users";
        try
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        Console.WriteLine("ID\t姓名\t年龄");
                        while (reader.Read()) // 逐行读取
                        {
                            int id = reader.GetInt32(0); // 获取第一列(Id)
                            string name = reader.GetString(1); // 获取第二列(Name)
                            int age = reader.GetInt32(2); // 获取第三列(Age)
                            Console.WriteLine($"{id}\t{name}\t{age}");
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"查询失败:{ex.Message}");
        }
    }
}

增删改操作(Insert/Update/Delete)

增删改操作属于“写操作”,使用 SqlCommandExecuteNonQuery() 方法执行,返回受影响的行数。

示例1:插入数据(Insert)

string insertSql = "INSERT INTO Users (Name, Age) VALUES (@Name, @Age)";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand command = new SqlCommand(insertSql, connection))
    {
        // 参数化查询(防止 SQL 注入)
        command.Parameters.AddWithValue("@Name", "张三");
        command.Parameters.AddWithValue("@Age", 25);
        int rowsAffected = command.ExecuteNonQuery();
        Console.WriteLine($"插入成功,影响 {rowsAffected} 行");
    }
}

示例2:更新数据(Update)

string updateSql = "UPDATE Users SET Age = @Age WHERE Name = @Name";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand command = new SqlCommand(updateSql, connection))
    {
        command.Parameters.AddWithValue("@Age", 26);
        command.Parameters.AddWithValue("@Name", "张三");
        int rowsAffected = command.ExecuteNonQuery();
        Console.WriteLine($"更新成功,影响 {rowsAffected} 行");
    }
}

示例3:删除数据(Delete)

string deleteSql = "DELETE FROM Users WHERE Id = @Id";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand command = new SqlCommand(deleteSql, connection))
    {
        command.Parameters.AddWithValue("@Id", 1);
        int rowsAffected = command.ExecuteNonQuery();
        Console.WriteLine($"删除成功,影响 {rowsAffected} 行");
    }
}

参数化查询的重要性

上述示例中使用了 Parameters.AddWithValue() 添加参数,这是防止 SQL 注入攻击的关键,若直接拼接 SQL 字符串(如 $"SELECT * FROM Users WHERE Name = '{name}'"),恶意用户可通过输入 ' OR '1'='1 等内容绕过验证,导致数据泄露,参数化查询会将参数值作为数据处理,而非 SQL 代码的一部分,从根本上杜绝注入风险。

事务处理

事务(Transaction)确保一组数据库操作要么全部成功,要么全部失败,保证数据一致性,转账时需同时扣减 A 账户余额、增加 B 账户余额,任一步骤失败则回滚整个操作。

文章版权声明:除非注明,否则均为xmsdn原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码