Skip to content

SQLServer 驱动程序配置

驱动程序概述

驱动程序的作用

SQLServer 驱动程序是应用程序与数据库之间的桥梁,负责处理数据的传输和转换。它将应用程序的请求转换为数据库可以理解的格式,并将数据库的响应转换回应用程序可以使用的格式。驱动程序还负责管理连接、处理事务、执行查询和返回结果等核心功能。

常用驱动程序类型

驱动类型适用语言/平台主要用途
ADO.NET.NET 应用Windows 平台上的 .NET 应用开发
ODBC多语言/平台跨平台应用、旧系统集成、BI 工具连接
JDBCJava 应用Java 应用、大数据平台、企业级应用
PythonPython 应用数据科学、机器学习、自动化脚本
Node.jsNode.js 应用Web 应用、微服务、实时应用
PHPPHP 应用Web 应用、CMS 系统
GoGo 应用高性能后端、云原生应用
RubyRuby 应用Web 应用、自动化脚本

驱动程序选择考虑因素

  1. 应用程序技术栈:根据开发语言和框架选择合适的驱动
  2. 性能要求:不同驱动的性能特性不同,需根据应用需求选择
  3. 跨平台需求:是否需要在多个平台上运行
  4. 兼容性:与 SQLServer 版本的兼容性
  5. 功能支持:是否支持所需的高级功能(如 Always Encrypted、列存储索引等)
  6. 维护状态:是否有活跃的维护和更新
  7. 社区支持:是否有丰富的文档和社区资源

ADO.NET 驱动

ADO.NET 驱动概述

ADO.NET 驱动是专为 .NET 应用程序设计的 SQLServer 驱动,提供了高性能的数据访问能力。它是 Windows 平台上 .NET 应用开发的首选驱动,支持最新的 SQLServer 功能。

ADO.NET 驱动版本

驱动版本适用 SQLServer 版本.NET 版本支持主要特性
System.Data.SqlClient2005-2022.NET Framework 2.0+传统 ADO.NET 驱动
Microsoft.Data.SqlClient2008-2022.NET Framework 4.6.1+, .NET Core 2.1+, .NET 5+新版 ADO.NET 驱动,支持更多云功能

ADO.NET 驱动安装

对于 .NET Framework 应用,System.Data.SqlClient 已包含在框架中,无需额外安装。

对于 .NET Core/.NET 5+ 应用,需要安装 Microsoft.Data.SqlClient NuGet 包:

bash
# 使用 .NET CLI 安装
 dotnet add package Microsoft.Data.SqlClient

# 使用 NuGet Package Manager 安装
Install-Package Microsoft.Data.SqlClient

ADO.NET 连接字符串

基本连接字符串

Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;

带加密的连接字符串

Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Encrypt=True;TrustServerCertificate=False;

使用 Windows 身份验证

Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;

示例代码

csharp
// 使用 Microsoft.Data.SqlClient 连接 SQLServer
using Microsoft.Data.SqlClient;

string connectionString = "Server=localhost;Database=TestDB;User Id=sa;Password=YourPassword;Encrypt=True;TrustServerCertificate=True;";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    string query = "SELECT * FROM Products WHERE CategoryId = @CategoryId";
    
    using (SqlCommand command = new SqlCommand(query, connection))
    {
        command.Parameters.AddWithValue("@CategoryId", 1);
        
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine($"Product: {reader["ProductName"]}, Price: {reader["Price"]}");
            }
        }
    }
}

ODBC 驱动

ODBC 驱动概述

ODBC(Open Database Connectivity)是一种开放的数据库连接标准,支持多种数据库和编程语言。SQLServer ODBC 驱动提供了跨平台的数据访问能力,适用于各种应用场景。

ODBC 驱动版本

驱动名称适用 SQLServer 版本平台主要特性
ODBC Driver 18 for SQL Server2012-2022, Azure SQLWindows, Linux, macOS最新版本,支持 TLS 1.3, Always Encrypted v2
ODBC Driver 17 for SQL Server2008-2022, Azure SQLWindows, Linux, macOS广泛使用的稳定版本
ODBC Driver 13 for SQL Server2005-2017, Azure SQLWindows, Linux旧版本,支持较老的 SQLServer 版本

ODBC 驱动安装

Windows

  1. 下载并安装 Microsoft ODBC Driver for SQL Server
  2. 或通过 Windows 更新获取

Linux (Ubuntu)

bash
# 添加 Microsoft 仓库
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list

# 安装 ODBC 驱动
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
sudo apt-get install -y unixodbc-dev

macOS

bash
# 使用 Homebrew 安装
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql18 mssql-tools18

ODBC 数据源配置

Windows ODBC 数据源配置

  1. 打开 "ODBC 数据源 Administrator"(64位或32位,根据应用程序架构选择)
  2. 在 "用户 DSN" 或 "系统 DSN" 选项卡中,点击 "添加"
  3. 选择 "ODBC Driver 18 for SQL Server",点击 "完成"
  4. 配置数据源名称、服务器地址、身份验证方式等
  5. 点击 "测试连接",验证配置是否正确

Linux/macOS ODBC 数据源配置

编辑 /etc/odbc.ini(系统数据源)或 ~/.odbc.ini(用户数据源):

ini
[TestDB]
Driver=ODBC Driver 18 for SQL Server
Server=tcp:localhost,1433
Database=TestDB
Encrypt=yes
TrustServerCertificate=yes

ODBC 连接字符串

DSN 连接

DSN=TestDB;UID=sa;PWD=YourPassword;

无 DSN 连接

Driver={ODBC Driver 18 for SQL Server};Server=tcp:localhost,1433;Database=TestDB;UID=sa;PWD=YourPassword;Encrypt=yes;TrustServerCertificate=yes;

示例代码(Python + pyodbc)

python
import pyodbc

# 使用 DSN 连接
conn = pyodbc.connect('DSN=TestDB;UID=sa;PWD=YourPassword')

# 或使用完整连接字符串
# conn = pyodbc.connect('DRIVER={ODBC Driver 18 for SQL Server};SERVER=localhost;DATABASE=TestDB;UID=sa;PWD=YourPassword;Encrypt=yes;TrustServerCertificate=yes;')

cursor = conn.cursor()
cursor.execute('SELECT * FROM Products WHERE CategoryId = ?', 1)

for row in cursor:
    print(f'Product: {row.ProductName}, Price: {row.Price}')

cursor.close()
conn.close()

JDBC 驱动

JDBC 驱动概述

JDBC(Java Database Connectivity)是 Java 应用程序访问数据库的标准 API。SQLServer JDBC 驱动允许 Java 应用程序连接到 SQLServer 数据库,支持各种 Java 环境。

JDBC 驱动版本

驱动版本适用 SQLServer 版本Java 版本支持主要特性
Microsoft JDBC Driver 12.42012-2022, Azure SQLJava 8-21最新版本,支持 Java 21
Microsoft JDBC Driver 11.22012-2022, Azure SQLJava 8-18支持 Java 18
Microsoft JDBC Driver 10.22012-2019, Azure SQLJava 8-16支持 Java 16

JDBC 驱动安装

通过 Maven 添加依赖:

xml
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>12.4.2.jre21</version>
</dependency>

或通过 Gradle 添加依赖:

ini
dependencies {
    implementation 'com.microsoft.sqlserver:mssql-jdbc:12.4.2.jre21'
}

JDBC 连接字符串

基本连接字符串

jdbc:sqlserver://localhost:1433;databaseName=TestDB;user=sa;password=YourPassword;

带加密的连接字符串

jdbc:sqlserver://localhost:1433;databaseName=TestDB;user=sa;password=YourPassword;encrypt=true;trustServerCertificate=true;

使用 Windows 身份验证

jdbc:sqlserver://localhost:1433;databaseName=TestDB;integratedSecurity=true;

示例代码

java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SqlServerJdbcExample {
    public static void main(String[] args) {
        String connectionUrl = "jdbc:sqlserver://localhost:1433;databaseName=TestDB;user=sa;password=YourPassword;encrypt=true;trustServerCertificate=true;";
        
        try (Connection conn = DriverManager.getConnection(connectionUrl);
             PreparedStatement stmt = conn.prepareStatement("SELECT * FROM Products WHERE CategoryId = ?")) {
            
            stmt.setInt(1, 1);
            ResultSet rs = stmt.executeQuery();
            
            while (rs.next()) {
                System.out.printf("Product: %s, Price: %.2f%n", 
                    rs.getString("ProductName"), rs.getDouble("Price"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Python 驱动

Python 驱动概述

SQLServer 提供了多个 Python 驱动,其中最常用的是 pyodbc(基于 ODBC)和 pymssql(原生驱动)。pyodbc 是官方推荐的驱动,支持最新的 SQLServer 功能。

Python 驱动安装

bash
# 安装 pyodbc
pip install pyodbc

# 安装 pymssql(可选,不推荐用于新项目)
pip install pymssql

Python 连接字符串

pyodbc 连接字符串

python
# 使用 ODBC 驱动 18
conn_str = (
    "Driver={ODBC Driver 18 for SQL Server};"
    "Server=localhost;"
    "Database=TestDB;"
    "UID=sa;"
    "PWD=YourPassword;"
    "Encrypt=yes;"
    "TrustServerCertificate=yes;"
)

pymssql 连接字符串

python
conn_str = {
    'server': 'localhost',
    'database': 'TestDB',
    'user': 'sa',
    'password': 'YourPassword',
    'as_dict': True
}

示例代码(pyodbc + pandas)

python
import pyodbc
import pandas as pd

# 连接到 SQLServer
conn_str = "Driver={ODBC Driver 18 for SQL Server};Server=localhost;Database=TestDB;UID=sa;PWD=YourPassword;Encrypt=yes;TrustServerCertificate=yes;"
conn = pyodbc.connect(conn_str)

# 使用 pandas 读取数据
df = pd.read_sql_query("SELECT * FROM Products WHERE CategoryId = ?", conn, params=[1])
print(df)

# 使用 pandas 写入数据
new_data = pd.DataFrame({
    'ProductName': ['New Product'],
    'CategoryId': [1],
    'Price': [99.99]
})
new_data.to_sql('Products', conn, if_exists='append', index=False)

conn.close()

Node.js 驱动

Node.js 驱动概述

SQLServer 提供了官方的 Node.js 驱动 tedious,以及基于它的封装 mssqlmssql 是更常用的驱动,提供了更简洁的 API。

Node.js 驱动安装

bash
# 安装 mssql 驱动(推荐)
npm install mssql

# 或安装 tedious 驱动(底层驱动)
npm install tedious

Node.js 连接配置

mssql 连接配置

javascript
const config = {
    user: 'sa',
    password: 'YourPassword',
    server: 'localhost',
    database: 'TestDB',
    options: {
        encrypt: true, // 启用加密
        trustServerCertificate: true // 信任自签名证书
    }
};

示例代码(mssql)

javascript
const sql = require('mssql');

const config = {
    user: 'sa',
    password: 'YourPassword',
    server: 'localhost',
    database: 'TestDB',
    options: {
        encrypt: true,
        trustServerCertificate: true
    }
};

async function getProducts() {
    try {
        // 建立连接池
        await sql.connect(config);
        
        // 执行查询
        const result = await sql.query`SELECT * FROM Products WHERE CategoryId = ${1}`;
        console.log(result.recordset);
        
        // 执行参数化查询
        const request = new sql.Request();
        request.input('CategoryId', sql.Int, 1);
        const result2 = await request.query('SELECT * FROM Products WHERE CategoryId = @CategoryId');
        console.log(result2.recordset);
    } catch (err) {
        console.error(err);
    } finally {
        // 关闭连接池
        await sql.close();
    }
}

getProducts();

驱动程序性能优化

连接池配置

连接池可以重用数据库连接,避免频繁创建和关闭连接带来的性能开销。

ADO.NET 连接池配置

csharp
string connectionString = "Server=localhost;Database=TestDB;User Id=sa;Password=YourPassword;" +
    "Min Pool Size=5;Max Pool Size=100;Connection Timeout=30;";

JDBC 连接池配置

java
// 使用 HikariCP 连接池
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:sqlserver://localhost:1433;databaseName=TestDB");
config.setUsername("sa");
config.setPassword("YourPassword");
config.setMinimumIdle(5);
config.setMaximumPoolSize(100);
config.setConnectionTimeout(30000);

HikariDataSource dataSource = new HikariDataSource(config);

查询优化

  1. 使用参数化查询:避免 SQL 注入,提高查询计划重用率
  2. 只查询需要的列:避免 SELECT *,减少数据传输量
  3. 使用适当的索引:根据查询模式设计索引
  4. 限制结果集大小:使用 TOP 或 LIMIT 限制返回行数
  5. 避免在 WHERE 子句中使用函数:会导致索引失效

批量操作优化

ADO.NET 批量插入

csharp
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
    bulkCopy.DestinationTableName = "Products";
    bulkCopy.WriteToServer(dataTable);
}

JDBC 批量插入

java
connection.setAutoCommit(false);
PreparedStatement stmt = connection.prepareStatement("INSERT INTO Products (ProductName, Price) VALUES (?, ?)");

for (Product product : products) {
    stmt.setString(1, product.getName());
    stmt.setDouble(2, product.getPrice());
    stmt.addBatch();
}

stmt.executeBatch();
connection.commit();

异步操作

使用异步 API 可以提高应用程序的并发处理能力,减少线程阻塞。

ADO.NET 异步查询

csharp
using (SqlDataReader reader = await command.ExecuteReaderAsync())
{
    while (await reader.ReadAsync())
    {
        // 处理结果
    }
}

Node.js 异步操作

javascript
// 使用 async/await 进行异步操作
const result = await sql.query`SELECT * FROM Products`;

驱动程序安全配置

加密连接

启用加密连接可以防止数据在传输过程中被窃取或篡改。

ADO.NET 加密连接

Encrypt=True;TrustServerCertificate=False;

JDBC 加密连接

jdbc:sqlserver://localhost:1433;databaseName=TestDB;encrypt=true;trustServerCertificate=false;

证书验证

在生产环境中,应该启用证书验证,确保连接到合法的数据库服务器。

信任服务器证书(仅开发环境)

TrustServerCertificate=True;

生产环境配置

  1. 安装合法的 SSL 证书到 SQLServer
  2. 禁用 TrustServerCertificate 选项
  3. 确保客户端信任证书颁发机构

身份验证配置

优先使用 Windows 身份验证

对于 Windows 环境,建议使用 Windows 身份验证,避免在连接字符串中存储密码。

使用 Azure AD 身份验证

对于 Azure SQL Database,可以使用 Azure AD 身份验证,提供更安全的身份管理。

ADO.NET Azure AD 身份验证

csharp
string connectionString = "Server=your-server.database.windows.net;Database=TestDB;Authentication=Active Directory Password;UID=user@domain.com;PWD=YourPassword;";

敏感数据保护

  1. 避免硬编码连接字符串:使用配置文件、环境变量或密钥管理服务
  2. 使用 Always Encrypted:保护敏感数据,即使数据库被泄露也能保持安全
  3. 使用动态数据 masking:限制敏感数据的可见性
  4. 定期轮换密码:定期更新数据库账号密码

驱动程序故障排除

连接失败问题

常见原因及解决方案

  1. 网络问题:检查网络连接、防火墙设置、服务器端口是否开放
  2. 服务器未启动:验证 SQLServer 服务是否正在运行
  3. 身份验证失败:检查用户名和密码是否正确,验证身份验证模式
  4. 数据库不存在:检查数据库名称是否正确
  5. 加密配置错误:检查加密设置和证书配置

诊断命令

bash
# 检查 SQLServer 端口是否开放
telnet localhost 1433

# 检查 SQLServer 服务状态
# Windows
services.msc
# Linux
systemctl status mssql-server

性能问题

常见原因及解决方案

  1. 连接池配置不当:调整连接池大小和超时设置
  2. 查询性能差:优化查询、添加适当的索引
  3. 网络延迟:检查网络带宽和延迟
  4. 服务器资源不足:监控 CPU、内存、磁盘使用情况
  5. 驱动版本过旧:升级到最新版本的驱动

兼容性问题

常见原因及解决方案

  1. 驱动版本与 SQLServer 版本不兼容:选择兼容的驱动版本
  2. 应用程序框架版本不兼容:调整应用程序框架或驱动版本
  3. 操作系统不兼容:选择适合当前操作系统的驱动版本

日志记录与调试

启用驱动日志

  1. ADO.NET:使用 Visual Studio 调试器、SQL Server Profiler 或 Application Insights
  2. ODBC:启用 ODBC 跟踪
  3. JDBC:设置日志级别和日志文件
  4. Python:使用 logging 模块记录连接和查询信息
  5. Node.js:设置环境变量 DEBUG=tedious:* 启用 tedious 日志

常见问题 (FAQ)

Q: 如何选择合适的 SQLServer 驱动程序?

A: 选择驱动程序应考虑以下因素:

  • 应用程序技术栈(.NET、Java、Python 等)
  • 性能要求和并发需求
  • 跨平台需求
  • SQLServer 版本兼容性
  • 所需功能支持(如 Always Encrypted、Azure AD 身份验证等)
  • 社区支持和维护状态

Q: 为什么连接到 SQLServer 时出现加密错误?

A: 常见原因包括:

  • 驱动默认启用了加密,但服务器未配置 SSL 证书
  • 证书验证失败(证书过期、颁发机构不被信任等)
  • 网络环境阻止了加密连接

解决方案:

  • 对于开发环境,可以临时设置 TrustServerCertificate=True
  • 对于生产环境,应为 SQLServer 配置合法的 SSL 证书
  • 检查防火墙设置,确保允许加密连接

Q: 如何提高驱动程序的性能?

A: 提高驱动程序性能的方法包括:

  • 配置适当大小的连接池
  • 使用参数化查询,提高查询计划重用率
  • 只查询需要的列,减少数据传输量
  • 使用批量操作处理大量数据
  • 启用异步操作,提高并发处理能力
  • 使用适当的索引,优化查询性能

Q: 如何在连接字符串中安全地存储密码?

A: 安全存储密码的方法包括:

  • 使用 Windows 身份验证,避免在连接字符串中存储密码
  • 使用环境变量存储密码,在运行时读取
  • 使用配置文件加密,如 .NET 的 Protected Configuration
  • 使用密钥管理服务,如 Azure Key Vault、HashiCorp Vault
  • 避免硬编码密码到源代码中

Q: 如何处理连接泄漏问题?

A: 处理连接泄漏的方法包括:

  • 使用 try-finally 或 using 语句确保连接被正确关闭
  • 监控连接池使用情况,设置适当的最大连接数
  • 定期检查应用程序中的连接使用模式
  • 使用连接池监控工具,如 SQL Server Profiler 或 Application Insights

Q: 如何迁移到新版本的驱动程序?

A: 迁移到新版本驱动程序的步骤:

  1. 了解新版本驱动的变化和兼容性
  2. 在测试环境中进行充分测试
  3. 检查连接字符串配置,更新驱动名称和参数
  4. 验证应用程序功能是否正常
  5. 监控性能变化,必要时进行优化
  6. 分阶段部署到生产环境

版本差异

SQLServer 2016+ 驱动特性

  1. Always Encrypted 支持:保护敏感数据,加密和解密在客户端进行
  2. JSON 支持:直接处理 JSON 数据类型
  3. 行级安全性:基于用户身份的行级访问控制
  4. 动态数据 masking:实时数据脱敏

SQLServer 2019+ 驱动特性

  1. UTF-8 支持:原生 UTF-8 字符集支持
  2. 加速数据库恢复:提高数据库恢复速度
  3. 内存优化 TempDB 元数据:提高 TempDB 性能
  4. 智能查询处理:自动优化查询性能

Azure SQL Database 驱动特性

  1. Azure AD 身份验证:支持多种 Azure AD 身份验证方式
  2. 弹性池支持:优化多数据库的连接管理
  3. 自动故障转移支持:提高应用程序的高可用性
  4. 长连接支持:优化云环境中的连接管理

总结

SQLServer 驱动程序是应用程序与数据库之间的重要桥梁,选择合适的驱动程序并进行正确的配置对于应用程序的性能、安全性和可靠性至关重要。

在实际生产环境中,应根据应用程序的技术栈、性能要求和安全需求选择合适的驱动程序,并遵循最佳实践进行配置和优化。同时,应定期更新驱动程序版本,以获得最新的功能和安全补丁。

通过合理的驱动程序配置和优化,可以提高应用程序的性能、增强安全性、减少故障风险,并确保应用程序与 SQLServer 数据库的良好交互。