C# 中使用 SqlConnection 操作 SQL Server 数据库
连接字符串配置与解析
在 C# 中连接 SQL Server 时,需正确构造连接字符串。常见两种认证方式:
- SQL Server 身份验证(显式用户名密码):
string connStr = "Server=.;Database=TestDB;User Id=sa;Password=123456";
可简写为:
Server=.;Database=TestDB;Uid=sa;Pwd=123456; - Windows 身份验证(集成安全):
string connStr = "Server=.;Database=TestDB;Integrated Security=SSPI";
或使用等效写法:
Trusted_Connection=True;
说明:
Server等同于Data SourceDatabase等同于Initial CatalogUid与User Id、Pwd与Password对应- 本地服务器可用
.或localhost表示;远程则需指定 IP 地址或主机名及端口 - 连接字符串中的键值对不区分大小写
配置文件管理连接字符串
推荐将连接字符串存入应用配置文件中。
1. 通过 <connectionStrings> 节点存储(推荐)
<configuration>
<connectionStrings>
<add name="DbConnection"
connectionString="Server=.;Database=MyAppDB;Uid=admin;Pwd=securePass;"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
2. 通过 <appSettings> 节点存储
<appSettings> <add key="DbConnString" value="Server=.;Database=MyAppDB;Uid=admin;Pwd=securePass;" /> </appSettings>
读取配置信息
需引用 System.Configuration 并添加命名空间:
using System.Configuration;
读取方式如下:
// 从 connectionStrings 节点读取 string connString = ConfigurationManager.ConnectionStrings["DbConnection"].ConnectionString; // 从 appSettings 节点读取 string connString = ConfigurationManager.AppSettings["DbConnString"];
创建数据库连接实例
// 推荐方式:直接传入连接字符串 SqlConnection dbConnection = new SqlConnection(connString); // 或分步设置 SqlConnection dbConnection = new SqlConnection(); dbConnection.ConnectionString = connString;
资源自动释放:使用 using 语句
SqlConnection 实现了 IDisposable 接口,建议使用 using 确保连接及时关闭:
using (var connection = new SqlConnection(connString))
{
connection.Open();
// 执行数据库操作...
}
// 连接在此处自动释放,状态为 Closed
Console.WriteLine(connection.State); // 显示:Closed
配置文件加密保护
防止敏感信息泄露,可对配置节进行加密:
Configuration config = ConfigurationManager.OpenExeConfiguration("YourApp.exe");
ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection;
if (section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection(); // 解密
}
else
{
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); // 加密
}
config.Save(); // 保存更改
性能测试:使用 Stopwatch 测量执行时间
Stopwatch timer = new Stopwatch();
timer.Start();
// 待测代码段
for (int i = 0; i < 100000; i++) { /* 模拟操作 */ }
timer.Stop();
Console.WriteLine($"耗时:{timer.ElapsedMilliseconds} 毫秒");
SqlCommand 命令对象操作
用于执行 SQL 语句或存储过程。
核心属性
Connection:关联的数据库连接对象CommandText:要执行的 T-SQL 语句或存储过程名称CommandType:可选Text(默认)或StoredProcedureParameters:参数集合,支持动态传参Transaction:绑定事务上下文
创建命令对象的推荐方式
// 推荐:直接传入 SQL 和连接
SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Age > @age", connection);
// 或通过连接创建
SqlCommand cmd2 = connection.CreateCommand();
cmd2.CommandText = "INSERT INTO Logs VALUES (@msg)";
cmd2.Parameters.AddWithValue("@msg", "System started");
// 事务场景
string deleteSql = "DELETE FROM Employees WHERE DeptId = @dept";
SqlCommand cmd3 = new SqlCommand(deleteSql, connection, transaction);
SqlParameter 参数化处理
防止注入攻击,必须使用参数化查询。
常用属性
ParameterName:参数占位符,如@usernameValue:实际传入值DbType:对应数据库字段类型(如VarChar,Int)Size:最大长度(单位:字节)Direction:输入/输出/返回值等方向
参数声明方式
// 1. 构造后赋值
SqlParameter param1 = new SqlParameter();
param1.ParameterName = "@name";
param1.SqlDbType = SqlDbType.VarChar;
param1.Size = 50;
param1.Value = "Alice";
// 2. 直接初始化名称和值
SqlParameter param2 = new SqlParameter("@age", 25);
// 3. 指定名称和数据类型
SqlParameter param3 = new SqlParameter("@deptId", SqlDbType.Int);
param3.Value = 3;
// 4. 包含大小和类型
SqlParameter param4 = new SqlParameter("@pwd", SqlDbType.VarChar, 32);
param4.Value = "secret123";
// 5. 带源列映射(用于 DataTable)
SqlParameter param5 = new SqlParameter("@userName", SqlDbType.VarChar, 20, "UserName");
SqlDataReader 读取数据流
提供高效、只进、只读的数据读取方式,适用于批量读取。
特点与限制
- 只能向前读取,无法回滚
- 轻量级,性能高,适合小到中等规模数据集
- 持续占用数据库连接,务必及时关闭
- 不可修改数据,仅用于读取
使用方法
using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read())
{
string name = reader["Name"].ToString();
int age = reader.GetInt32("Age");
// 处理每一行数据
}
}
// 读取完成后,连接自动关闭
关键注意事项
- 调用
Read()返回false表示无更多数据 - 若提前终止读取,应先调用
Cancel()再关闭Close() - 获取存储过程的输出参数前,必须先关闭
DataReader
常用属性
FieldCount:当前行包含的列数HasRows:是否至少有一行数据IsClosed:读取器是否已关闭[index]:按列索引访问数据(如reader[0])[columnName]:按列名访问数据(如reader["Email"])