【问题标题】:Can't access my SQL Server via C# form application from client device无法从客户端设备通过 C# 表单应用程序访问我的 SQL Server
【发布时间】:2022-06-29 07:40:32
【问题描述】:

我有一个 C# 应用程序连接到我机器上的在线服务器 当我在 Visual Studio 中测试我的应用程序时,它工作正常,但是当我将应用程序提供给客户端时,它不起作用 我在我的代码中直接在单击按钮事件中使用此连接字符串:

@"Data Source =MyServerIp\SQLEXPRESS; Initial Catalog = MyDBname; User Id = gues; Password=gues";

我在我的 SQL 服务器中打开了混合模式 我已经在我的防火墙和路由器端口转发中正确完成了配置 仍然收到该错误:

您的应用程序中发生了未处理的异常。如果单击继续,应用程序将忽略错误并尝试继续。 如果单击退出,应用程序将立即关闭。 建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)。

我确定我的 IP 并且可以通过互联网访问 而且我从我的凭据和防火墙设置中确定

我被告知客户端必须安装本地数据库 我试过了,我安装了本地数据库但没有配置任何东西

你能帮我找出我的问题到底在哪里吗?

更新 (问题解决了) 我可能有两个问题,这使得调试变得更加困难。 我的两个问题是:

  1. 客户端机器上过时的网络框架。

  2. 错误的sql连接字符串,已通过下面的答案修复。

对不起,我不知道如何将问题状态更改为已解决..

【问题讨论】:

标签: c# sql-server


【解决方案1】:

从以下开始,排查您无法连接到 SQL Server 的原因。

打开 PowerShell 并运行以下命令来检查 SQL Server 是否正在侦听 TCP/IP 端口

注意:命令来自这个post

ForEach ($SQL_Proc in Get-Process | Select-Object -Property ProcessName, Id | Where-Object {$_.ProcessName -like "*SQL*"})
{
    Get-NetTCPConnection | `
     Where-Object {$_.OwningProcess -eq $SQL_Proc.id} | `
      Select-Object -Property `
                                @{Label ="Process_Name";e={$SQL_Proc.ProcessName}}, `
                                @{Label ="Local_Address";e={$_.LocalAddress + ":" + $_.LocalPort }},  `
                                @{Label ="Remote_Address";e={$_.RemoteAddress + ":" + $_.RemotePort}}, State | `
      Format-Table
} 

如果它正在收听,您会看到类似于以下内容:

如果不是,它不会返回任何东西。在这种情况下,请继续下一步。

打开SQL Server Configuration Manager

在 SQL Server 配置管理器中,确保为 SQL Server 启用 TCP/IP。如果没有,请启用它。

双击 TCP/IP 打开属性窗口。单击“IP 地址”选项卡。滚动到底部。在这里您可以将其从使用“TCP 动态端口”更改为使用指定的 TCP 端口(即:1433)

如果您对 TCP 端口进行了任何更改,则必须重新启动 SQL Server 服务(控制面板 => 管理工具 => 服务 => SQL Server...)。或者,您可以重新启动计算机。

获取 SQL Server 实例名称

  • 打开 PowerShell,然后键入以下内容:
Get-CimInstance -Namespace Root\Microsoft\SqlServer  -Query "Select Name from __Namespace where Name like 'ComputerManagement%'" | ForEach-Object { $sqlMgmtVer = $_.Name; Get-CimInstance -Namespace Root\Microsoft\SqlServer\$sqlMgmtVer -Class FileStreamSettings |Select-Object InstanceName }

确定您的本地 IP 地址

  • 打开 PowerShell,然后键入以下内容:
 Get-CimInstance -Namespace Root\cimv2 -Query "SELECT Description, DHCPEnabled, DHCPServer, IPAddress, MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True" | Select-Object Description, DHCPEnabled, DHCPServer, IPAddress, MACAddress

确定您的公共 IP 地址

Configure the Windows Firewall to Allow SQL Server Access.

Configure a Windows Firewall for Database Engine Access(显示如何在使用动态端口时配置 Windows 防火墙)

注意:除了配置 Windows 防火墙外,可能还需要在路由器中设置端口转发。有关详细信息,请参阅路由器的文档。


更新

提供者:命名管道提供者,错误:40 - 无法打开 连接到 SQL Server

根据SQL Server clients may change protocols when the client computers try to connect to an instance of SQL Server

...如果客户端计算机同时具有可用的 TCP 和命名管道,并且 顺序是:

  • TCP
  • 命名管道

当客户端计算机尝试与服务器建立 TCP 连接时 并且连接尝试返回一个非零返回码,客户端 通过使用中的下一个协议透明地尝试连接 列表,也就是命名管道...

客户端未收到指示第一个协议的错误 失败了。

如果客户端应用程序使用第二个协议,它也 返回错误,错误返回给客户端。

如果您使用以下方法之一创建别名,则客户端 应用程序使用别名信息建立连接到 服务器并且不使用任何附加协议 ...如果您想控制客户端应用程序用于每次连接尝试的协议,并且不允许 客户端尝试多种协议,您可以执行以下操作之一:

使用 SQL 客户端网络实用程序或 SQL Server 配置管理器 通过指定您喜欢的协议来创建别名。

在您的连接字符串中指定协议。

根据connection string文档,要指定连接只使用TCP/IP,需要在连接字符串中指定Network Library=DBMSSOCN;

示例

Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;

另见Network Protocol for SQL Server Connection

根据Configure a Windows Firewall for Database Engine Access

SQL Server Browser 服务允许用户连接到 未在端口 1433 上侦听的数据库引擎,但不知道 端口号。要使用 SQL Server Browser,您必须打开 UDP 端口 1434. 为了提升最安全的环境,让 SQL Server Browser 服务停止,并配置客户端使用 端口号。 ... 作为将 SQL Server 配置为侦听固定端口并打开端口的替代方法,您可以列出 SQL Server 可执行文件 (Sqlservr.exe) 作为 被阻止的程序。想继续使用时使用此方法 动态端口。在此只能访问一个 SQL Server 实例 方式。

查看哪些 SQL Server 服务正在运行

打开 PowerShell 并键入以下内容:

Get-Service | Where-Object { $_.DisplayName -Match "^SQL Server.*"}

其他资源

【讨论】:

    猜你喜欢
    • 2015-03-25
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多