文章目录

一、连接字符串基础
1. 连接字符串组成原理
连接字符串是客户端应用程序与数据库服务器建立连接时使用的参数集合,包含:
- 服务器地址
- 认证信息
- 数据库名称
- 连接参数(超时、加密等)
- 特定数据库的专有参数
2. 通用格式
协议/驱动前缀://[用户名:密码@]服务器地址[:端口]/数据库名称[?参数1=值1&参数2=值2...]
二、各数据库连接字符串详解
1. SQL Server
基本连接字符串
// Windows认证
"Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"
// SQL认证
"Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
// 命名实例
"Server=myServerName\instanceName;Database=myDataBase;User Id=myUsername;Password=myPassword;"
// 指定端口
"Server=myServerName,1433;Database=myDataBase;User Id=myUsername;Password=myPassword;"
常用参数
Connect Timeout=30
- 连接超时(秒)Encrypt=True
- 启用加密MultipleActiveResultSets=True
- 启用多活动结果集(MARS)Application Name=MyApp
- 设置应用程序名称
帮助类示例
public class SqlServerHelper
{
private readonly string _connectionString;
public SqlServerHelper(string connectionString)
{
_connectionString = connectionString;
}
public DataTable ExecuteQuery(string sql, params SqlParameter[] parameters)
{
using (var conn = new SqlConnection(_connectionString))
{
conn.Open();
using (var cmd = new SqlCommand(sql, conn))
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
var dt = new DataTable();
using (var reader = cmd.ExecuteReader())
{
dt.Load(reader);
}
return dt;
}
}
}
public int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
{
using (var conn = new SqlConnection(_connectionString))
{
conn.Open();
using (var cmd = new SqlCommand(sql, conn))
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery();
}
}
}
}
2. MySQL
基本连接字符串
"Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;Port=3306;"
// 使用SSL
"Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;SslMode=Required;"
常用参数
AllowPublicKeyRetrieval=True
- 允许公钥检索ConnectionTimeout=30
- 连接超时Pooling=true
- 启用连接池DefaultCommandTimeout=120
- 命令超时
帮助类示例
public class MySqlHelper
{
private readonly string _connectionString;
public MySqlHelper(string connectionString)
{
_connectionString = connectionString;
}
public DataTable ExecuteQuery(string sql, params MySqlParameter[] parameters)
{
using (var conn = new MySqlConnection(_connectionString))
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
var dt = new DataTable();
using (var reader = cmd.ExecuteReader())
{
dt.Load(reader);
}
return dt;
}
}
}
public int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
{
using (var conn = new MySqlConnection(_connectionString))
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery();
}
}
}
}
3. Oracle
基本连接字符串
// 基本格式
"User Id=myUsername;Password=myPassword;Data Source=myOracleDB;"
// TNS格式
"User Id=myUsername;Password=myPassword;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myServer)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myOracleSID)));"
// 简易格式
"User Id=myUsername;Password=myPassword;Data Source=//myServer:1521/myOracleSID;"
常用参数
Pooling=true
- 启用连接池Min Pool Size=5
- 最小连接数Max Pool Size=50
- 最大连接数Incr Pool Size=5
- 连接增长步长Statement Cache Size=25
- 语句缓存大小
帮助类示例
public class OracleHelper
{
private readonly string _connectionString;
public OracleHelper(string connectionString)
{
_connectionString = connectionString;
}
public DataTable ExecuteQuery(string sql, params OracleParameter[] parameters)
{
using (var conn = new OracleConnection(_connectionString))
{
conn.Open();
using (var cmd = new OracleCommand(sql, conn))
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
var dt = new DataTable();
using (var reader = cmd.ExecuteReader())
{
dt.Load(reader);
}
return dt;
}
}
}
public int ExecuteNonQuery(string sql, params OracleParameter[] parameters)
{
using (var conn = new OracleConnection(_connectionString))
{
conn.Open();
using (var cmd = new OracleCommand(sql, conn))
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery();
}
}
}
}
三、连接原理与优化方向
1. 连接建立过程
- 解析连接字符串
- 建立物理网络连接
- 认证过程
- 建立会话
- 返回连接对象给应用程序
2. 性能优化方向
连接池优化
- 合理设置
Min Pool Size
和Max Pool Size
- 避免连接泄漏(确保使用using语句)
- 设置适当的
Connection Lifetime
网络优化
- 使用
Encrypt
和TrustServerCertificate
平衡安全与性能 - 对于高延迟网络,增加
Connect Timeout
资源优化
- 设置合理的
Command Timeout
- 使用
MARS
(SQL Server)减少连接需求 - 启用
Statement Caching
(Oracle)
3. 安全最佳实践
- 使用集成认证而非明文密码
- 连接字符串加密存储
- 最小权限原则
- 定期轮换凭据
四、通用帮助类进阶实现
public class DbHelper<TConnection, TCommand, TParameter, TDataAdapter>
where TConnection : IDbConnection, new()
where TCommand : IDbCommand, new()
where TDataAdapter : IDbDataAdapter, new()
{
private readonly string _connectionString;
public DbHelper(string connectionString)
{
_connectionString = connectionString;
}
public DataTable ExecuteQuery(string sql, params TParameter[] parameters)
{
using (var conn = (TConnection)Activator.CreateInstance(typeof(TConnection), _connectionString))
{
conn.Open();
using (var cmd = (TCommand)Activator.CreateInstance(typeof(TCommand), sql, conn))
{
if (parameters != null && parameters.Length > 0)
{
var paramCollection = cmd.CreateParameter();
foreach (var param in parameters)
{
paramCollection.Add(param);
}
}
var dt = new DataTable();
using (var adapter = (TDataAdapter)Activator.CreateInstance(typeof(TDataAdapter), cmd))
{
adapter.Fill(dt);
}
return dt;
}
}
}
public int ExecuteNonQuery(string sql, params TParameter[] parameters)
{
using (var conn = (TConnection)Activator.CreateInstance(typeof(TConnection), _connectionString))
{
conn.Open();
using (var cmd = (TCommand)Activator.CreateInstance(typeof(TCommand), sql, conn))
{
if (parameters != null && parameters.Length > 0)
{
var paramCollection = cmd.CreateParameter();
foreach (var param in parameters)
{
paramCollection.Add(param);
}
}
return cmd.ExecuteNonQuery();
}
}
}
}
五、使用示例
SQL Server 使用示例
var connectionString = "Server=.;Database=Northwind;Trusted_Connection=True;";
var helper = new SqlServerHelper(connectionString);
// 查询
var data = helper.ExecuteQuery("SELECT * FROM Customers WHERE Country = @country",
new SqlParameter("@country", "USA"));
// 执行
int affected = helper.ExecuteNonQuery("UPDATE Products SET Price = Price * 1.1 WHERE CategoryID = @catId",
new SqlParameter("@catId", 5));
MySQL 使用示例
var connectionString = "Server=localhost;Database=test;Uid=root;Pwd=123456;";
var helper = new MySqlHelper(connectionString);
// 查询
var data = helper.ExecuteQuery("SELECT * FROM users WHERE status = @status",
new MySqlParameter("@status", 1));
Oracle 使用示例
var connectionString = "User Id=scott;Password=tiger;Data Source=ORCL;";
var helper = new OracleHelper(connectionString);
// 查询
var data = helper.ExecuteQuery("SELECT * FROM emp WHERE deptno = :deptno",
new OracleParameter(":deptno", 20));
六、进阶优化建议
- 异步操作:实现
ExecuteQueryAsync
和ExecuteNonQueryAsync
方法 - 依赖注入:将帮助类注册为服务
- 日志记录:添加连接和命令执行日志
- 重试机制:实现瞬态故障处理
- 映射支持:添加ORM-like功能将结果映射到实体
- 事务支持:添加事务管理功能
- 性能监控:添加执行时间统计
通过以上实现和优化,可以构建出高效、安全且易用的数据库访问层,满足大多数应用程序的数据访问需求。