本指南详解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 管理,可执行以下命令:

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)
增删改操作属于“写操作”,使用 SqlCommand 的 ExecuteNonQuery() 方法执行,返回受影响的行数。
示例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 账户余额,任一步骤失败则回滚整个操作。

