返回
解决 ODBC 连接 MSSQL 数据库“拒绝连接”错误
php
2024-12-19 05:54:08
解决通过 ODBC 连接 MSSQL 数据库出错问题
当应用程序尝试通过 ODBC 连接到 MSSQL 数据库时,可能会遇到各种错误。其中,“目标计算机积极拒绝连接” 是一个常见问题,通常表明连接尝试被服务器拒绝。本文将深入探讨此问题的原因,并提供一系列解决方案。
连接问题排查
1. 检查SQL Server服务状态
确保 SQL Server 服务正在运行并且配置为接受远程连接。
-
操作步骤:
- 打开“服务”管理器 (services.msc)。
- 找到 SQL Server 服务 (例如,SQL Server (MSSQLSERVER))。
- 确认服务状态为“正在运行”,启动类型为“自动”或“手动”。
- 右键点击服务,选择“属性”,切换到“登录”选项卡,确保使用正确的服务帐户。
2. 验证 SQL Server 网络配置
SQL Server 需要配置为监听正确的 IP 地址和端口,并允许远程连接。
-
操作步骤:
- 打开 SQL Server 配置管理器。
- 导航到“SQL Server 网络配置” > “MSSQLSERVER 的协议”。
- 确保 TCP/IP 协议已启用。
- 右键点击 TCP/IP,选择“属性”。
- 切换到“IP 地址”选项卡。
- 找到服务器 IP 地址对应的配置部分,确保 TCP 端口为 1433 (默认端口),并且“已启用”设置为“是”。
- 确保“全部侦听”选项没有被选中,它有时可能会引起问题。
- 如果修改了配置,需要重启 SQL Server 服务使更改生效。
3. 防火墙设置
防火墙可能会阻止到 SQL Server 端口的连接。需要配置防火墙以允许通过端口 1433 (或 SQL Server 使用的自定义端口)的流量。
-
操作步骤 (Windows 防火墙):
- 打开“Windows Defender 防火墙” (wf.msc)。
- 点击“高级设置”。
- 选择“入站规则”,点击“新建规则”。
- 选择“端口”,点击“下一步”。
- 选择“TCP”,指定特定本地端口为 1433,点击“下一步”。
- 选择“允许连接”,点击“下一步”。
- 选择应用规则的网络类型,点击“下一步”。
- 为规则命名,点击“完成”。
- (可选) 如果需要,为出站规则重复相同的步骤。
* 命令行指令 (PowerShell):New-NetFirewallRule -DisplayName "SQL Server Port 1433" -Direction Inbound -Protocol TCP -LocalPort 1433 -Action Allow
ODBC 配置检查
1. ODBC 数据源名称 (DSN) 配置
不正确的 DSN 配置会导致连接失败。
* **操作步骤:**
1. 打开 ODBC 数据源管理器 (odbcad32.exe)。
2. 选择“系统 DSN”或“用户 DSN”选项卡,具体取决于你的需求。
3. 选择已创建的 DSN,点击“配置”。
4. 确认服务器名称、数据库名称、用户名和密码是否正确。
5. 点击“测试数据源”验证连接。
2. ODBC 驱动程序
使用的 ODBC 驱动程序必须与 SQL Server 版本兼容,且安装正确。建议使用 SQL Server Native Client 或 Microsoft ODBC Driver for SQL Server。
- 操作步骤:
1. 在 ODBC 数据源管理器中,添加新的系统或用户 DSN 时,选择正确的驱动程序。
2. 如果未列出所需的驱动程序,则需要从 Microsoft 官网下载并安装最新的 SQL Server Native Client 或 Microsoft ODBC Driver for SQL Server。安装后,重新启动系统。
3. 确认使用的PHP ODBC扩展已经安装且正确配置。
* **代码示例 (PHP):** 连接字符串中指定驱动
```php
<?php
$serverName = "your_server_name,1433";
$connectionInfo = array( "Database"=>"your_database_name", "UID"=>"your_username", "PWD"=>"your_password", "Driver" => "{ODBC Driver 17 for SQL Server}"); // 使用ODBC Driver 17 for SQL Server驱动
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
echo "连接成功<br />";
}else{
echo "连接失败<br />";
die( print_r( sqlsrv_errors(), true));
}
?>
```
`{ODBC Driver 17 for SQL Server}` 是一个示例驱动名称,实际名称可能因安装的版本而异。可在ODBC数据管理器中找到正确的驱动程序名称。
应用程序代码检查
确保 PHP 代码中的连接参数(如服务器名称、用户名、密码、数据库名称)正确无误。
- 代码示例 (PHP):
或者<?php $serverName = "your_server_name"; //服务器名称或IP地址, 若使用非默认端口号, 需要指定端口, 如: "your_server_name,1434" $connectionInfo = array( "Database"=>"your_database_name", "UID"=>"your_username", "PWD"=>"your_password"); $conn = sqlsrv_connect( $serverName, $connectionInfo); if( $conn ) { echo "连接成功<br />"; }else{ echo "连接失败<br />"; die( print_r( sqlsrv_errors(), true)); } ?>
<?php $user = "your_username"; $pass = "your_password"; $host = "your_server_name"; $db = "your_database_name"; $connectionString = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=$host;DATABASE=$db;UID=$user;PWD=$pass;"; // 指定使用ODBC Driver 17 for SQL Server驱动 $dbConn = odbc_connect($connectionString, '', ''); if ($dbConn) { echo "Connection successful."; } else { echo "Connection failed: " . odbc_errormsg(); } ?>
请将 your_server_name
、your_database_name
、your_username
和 your_password
替换为实际的 SQL Server 连接信息。若使用非默认端口 1433, 需在服务器名称后添加端口号, 例如: "your_server_name,1434"
。 此外, ODBC Driver 17 for SQL Server
需要根据实际安装的驱动程序版本进行调整。
- 安全建议: 避免在代码中直接硬编码数据库凭据。应该使用环境变量、配置文件或更安全的密钥管理机制来存储这些信息。
其他因素
- 网络连接 : 确保服务器具有稳定的网络连接,并且客户端机器可以访问服务器 IP 地址。
- SQL Server 用户权限 : 检查用于连接 SQL Server 的用户是否具有访问指定数据库的权限。
- SELinux/AppArmor : 如果服务器运行 Linux 并启用了 SELinux 或 AppArmor,则需要确保这些安全模块允许应用程序连接到 SQL Server 端口。
- 杀毒软件/安全软件干扰 : 某些安全软件可能会阻止连接。可以尝试临时禁用安全软件进行测试,并在排除问题后将其重新启用,同时将SQL Server相关进程和端口添加到白名单。
- TCP/IP 动态端口分配 : 避免SQL Server 使用动态端口,这会导致每次连接使用不同的端口号。在 SQL Server 配置管理器中, 确保 SQL Server 实例配置为使用静态端口。
- 命名管道协议 : 确认 Named Pipes 协议没有启用,并且服务器仅通过 TCP/IP 协议进行监听,除非应用程序显式需要通过命名管道进行连接。
- 多次连接尝试失败 : 如果同一客户端的多次连接尝试在短时间内失败,SQL Server 可能会临时阻止该客户端 IP 地址。可以检查 SQL Server 错误日志以获取详细信息,并在必要时解除对客户端 IP 的阻止。
通过以上步骤逐一排查和解决问题,可以有效诊断并通过ODBC连接 MSSQL 数据库出错的问题。
相关资源
- Microsoft SQL Server 文档: https://learn.microsoft.com/en-us/sql/
- PHP ODBC 文档: https://www.php.net/manual/en/book.uodbc.php