返回

解决 ODBC 连接 MSSQL 数据库“拒绝连接”错误

php

解决通过 ODBC 连接 MSSQL 数据库出错问题

当应用程序尝试通过 ODBC 连接到 MSSQL 数据库时,可能会遇到各种错误。其中,“目标计算机积极拒绝连接” 是一个常见问题,通常表明连接尝试被服务器拒绝。本文将深入探讨此问题的原因,并提供一系列解决方案。

连接问题排查

1. 检查SQL Server服务状态

确保 SQL Server 服务正在运行并且配置为接受远程连接。

  • 操作步骤:

    1. 打开“服务”管理器 (services.msc)。
    2. 找到 SQL Server 服务 (例如,SQL Server (MSSQLSERVER))。
    3. 确认服务状态为“正在运行”,启动类型为“自动”或“手动”。
    4. 右键点击服务,选择“属性”,切换到“登录”选项卡,确保使用正确的服务帐户。

2. 验证 SQL Server 网络配置

SQL Server 需要配置为监听正确的 IP 地址和端口,并允许远程连接。
  • 操作步骤:

    1. 打开 SQL Server 配置管理器。
    2. 导航到“SQL Server 网络配置” > “MSSQLSERVER 的协议”。
    3. 确保 TCP/IP 协议已启用。
    4. 右键点击 TCP/IP,选择“属性”。
    5. 切换到“IP 地址”选项卡。
    6. 找到服务器 IP 地址对应的配置部分,确保 TCP 端口为 1433 (默认端口),并且“已启用”设置为“是”。
    7. 确保“全部侦听”选项没有被选中,它有时可能会引起问题。
    8. 如果修改了配置,需要重启 SQL Server 服务使更改生效。

3. 防火墙设置

防火墙可能会阻止到 SQL Server 端口的连接。需要配置防火墙以允许通过端口 1433 (或 SQL Server 使用的自定义端口)的流量。

  • 操作步骤 (Windows 防火墙):

    1. 打开“Windows Defender 防火墙” (wf.msc)。
    2. 点击“高级设置”。
    3. 选择“入站规则”,点击“新建规则”。
    4. 选择“端口”,点击“下一步”。
    5. 选择“TCP”,指定特定本地端口为 1433,点击“下一步”。
    6. 选择“允许连接”,点击“下一步”。
    7. 选择应用规则的网络类型,点击“下一步”。
    8. 为规则命名,点击“完成”。
    9. (可选) 如果需要,为出站规则重复相同的步骤。
      * 命令行指令 (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_nameyour_database_nameyour_usernameyour_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 数据库出错的问题。

相关资源