常用关系型数据库连接字符串与帮助类详解

在这里插入图片描述


在这里插入图片描述

一、连接字符串基础

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. 连接建立过程

  1. 解析连接字符串
  2. 建立物理网络连接
  3. 认证过程
  4. 建立会话
  5. 返回连接对象给应用程序

2. 性能优化方向

连接池优化
  • 合理设置 Min Pool SizeMax Pool Size
  • 避免连接泄漏(确保使用using语句)
  • 设置适当的 Connection Lifetime
网络优化
  • 使用 EncryptTrustServerCertificate 平衡安全与性能
  • 对于高延迟网络,增加 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));

六、进阶优化建议

  1. 异步操作:实现 ExecuteQueryAsyncExecuteNonQueryAsync 方法
  2. 依赖注入:将帮助类注册为服务
  3. 日志记录:添加连接和命令执行日志
  4. 重试机制:实现瞬态故障处理
  5. 映射支持:添加ORM-like功能将结果映射到实体
  6. 事务支持:添加事务管理功能
  7. 性能监控:添加执行时间统计

通过以上实现和优化,可以构建出高效、安全且易用的数据库访问层,满足大多数应用程序的数据访问需求。

在这里插入图片描述

评论 108
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百锦再@新空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值