繁体   English   中英

无法从客户端设备通过 C# 表单应用程序访问我的 SQL Server

[英]Can't access my SQL Server via C# form application from client device

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

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

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

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

我确定我的 IP 并且可以通过 Internet 访问它,而且我确定我的凭据和防火墙设置

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

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

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

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

  2. 错误的sql连接字符串,它得到了下面的答案。

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

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

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

注意:命令来自这篇文章

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 配置管理器

在此处输入图像描述

在 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 }

或者,打开一个 cmd 窗口并键入:

sc query type=service | find /i "sql"

确定您的本地 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 地址

将 Windows 防火墙配置为允许 SQL Server 访问

为数据库引擎访问配置 Windows 防火墙(显示如何在使用动态端口时配置 Windows 防火墙)

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


更新

提供程序:命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接

根据SQL Server,当客户端计算机尝试连接到 SQL Server 实例时,客户端可能会更改协议

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

  • TCP
  • 命名管道

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

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

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

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

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

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

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

示例

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

另请参阅SQL Server 连接的网络协议

根据为数据库引擎访问配置 Windows 防火墙

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.*"}

其他资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM