如何通过互联网连接到远程 SQL Server Express?
how to connect to remote SQL Server Express over internet?
我有一个 Windows 10 PC 和 SQL Server Express,我设置了远程连接,分配了一个固定端口(express,22172,删除了 IPALL 下的 TCP 动态端口),设置了一个入站端口等规则
我可以从同一网络(同一 LAN 路由器)上的 Linux PC 连接和操作数据库,使用:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = @"192.168.1.22\SQLEXPRESS, 22172";
builder.InitialCatalog = "<database>";
builder.ItegratedSecurity= "sa";
builder.Password = "<password>"
string connectionString = builder.ConnectionString;
所以,正常的防火墙入站规则、远程连接设置等工作正常,对吗?我现在希望能够从位于不同互联网(来自不同的 location/town..)的 Windows PC 建立相同的连接
我有:
- 已为主机 PC 所在的路由器获取固定 IP
- 修复了
主机 PC 的本地 IP - 192.168.1.22 根据 this
link
- 在 IP2 下为“SQLEXPRESS - TCP/IP - IP 的协议设置 IP
地址”到 192.168.1.22
- 已添加 SQL 服务器 Windows NT - 64 位作为
防火墙中允许的应用程序
- 在 SQL 服务器中启用 TCP/IP 和命名管道
带启动的客户端网络实用程序 - 运行 - CLICONFG.exe
- 设置端口
在路由器上转发:服务端口22172,IP地址:
192.168.1.22,内部端口 22172,协议 - TCP,已启用
我已经关闭了防火墙,但仍然出现错误:“(提供商:TCP 提供商,错误 40 - 无法打开与 SQL 服务器的连接)
我尝试了这些连接字符串选项:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = @"tcp:xxx.xxx.x.xx\SQLEXPRESS, 22172";
builder.InitialCatalog = "<database>";
builder.UserID = "sa";
builder.IntegratedSecurity = false;
builder.Password = "<password>";
sqlConnect = builder.ConnectionString;
我也试过这些变化:
builder.DataSource = @"x.xxx.x.xx\SQLEXPRESS, 22172";
builder.DataSource = @"tcp:xxx.xxx.x.xx, 22172";
builder.DataSource = @"xxx.xxx.x.xx, 22172";
还有这些连接字符串:
sqlConnect = @"Data Source = tcp:xxx.xxx.x.xx\SQLEXPRESS,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
sqlConnect = @"Data Source = xxx.xxx.x.xx\SQLEXPRESS,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
sqlConnect = @"Data Source = tcp:xxx.xxx.x.xx,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
sqlConnect = @"Data Source = xxx.xxx.x.xx,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
另外,这个:
sqlConnect = @"Data Source=xxx.xxx.x.xx\SQLEXPRESS,22172;Initial Catalog=<database>;Persist Security Info=True;User ID=sa;Password=<password>;";
我已经扫描了有关 SO 等的所有相关问题 - 我在某个地方做错了什么?请帮忙
当 运行ning select * from sys.tcp_endpoints
在主机 SQL 上时的输出:因此,ip_address 对两者都是 NULL,端口对两者都是 0,并且 is_dynamic_port 两者都是 1 - 这是相关信息吗?
Dedicated Admin Connection 1 1 2 TCP 2 TSQL 0 STARTED 1 0 1 NULL
TSQL Default TCP 4 1 2 TCP 2 TSQL 0 STARTED 0 0 1 NULL
我已经多次尝试将动态端口更改为静态,我已经删除了配置管理器中的所有 0 或端口号,但 _is_dynamic_port 仍然是 1。事件查看器显示:
Server is listening on [ 'any' <ipv4> 22172].
如果我在 SQL 中 运行 以下内容,也会出现相同的消息:
EXEC xp_ReadErrorLog 0, 1, N'Server is listening on', N'any', NULL, NULL, 'DESC'
开始
为什么 SQL 设置保留在动态端口上?
从你的工作来看,我想你是在 Win PC 上设置的。
所以,...
- Linux 机器呢?它是否允许与 192.168.1.22 建立出站连接?
- 看看
SqlConnectionStringBuilder.IntegratedSecurity
。它应该有一个布尔值。 false
如果用户和密码应该用于身份验证 (https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnectionstringbuilder.integratedsecurity?view=dotnet-plat-ext-6.0)。
- 看看
SqlConnectionStringBuilder.UserID
。您的两个代码片段中都缺少它。但是在创建的连接字符串 Persist Security Info=True;User ID=sa;Password=<password>;
中提到了 «User ID»、«user» 和 «uid»。请看这里 (https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnectionstringbuilder.userid?view=dotnet-plat-ext-6.0).
检查您的 ISP 是否阻止端口/所有端口。这就是阻止我的原因。
我有一个 Windows 10 PC 和 SQL Server Express,我设置了远程连接,分配了一个固定端口(express,22172,删除了 IPALL 下的 TCP 动态端口),设置了一个入站端口等规则
我可以从同一网络(同一 LAN 路由器)上的 Linux PC 连接和操作数据库,使用:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = @"192.168.1.22\SQLEXPRESS, 22172";
builder.InitialCatalog = "<database>";
builder.ItegratedSecurity= "sa";
builder.Password = "<password>"
string connectionString = builder.ConnectionString;
所以,正常的防火墙入站规则、远程连接设置等工作正常,对吗?我现在希望能够从位于不同互联网(来自不同的 location/town..)的 Windows PC 建立相同的连接
我有:
- 已为主机 PC 所在的路由器获取固定 IP
- 修复了 主机 PC 的本地 IP - 192.168.1.22 根据 this link
- 在 IP2 下为“SQLEXPRESS - TCP/IP - IP 的协议设置 IP 地址”到 192.168.1.22
- 已添加 SQL 服务器 Windows NT - 64 位作为 防火墙中允许的应用程序
- 在 SQL 服务器中启用 TCP/IP 和命名管道 带启动的客户端网络实用程序 - 运行 - CLICONFG.exe
- 设置端口 在路由器上转发:服务端口22172,IP地址: 192.168.1.22,内部端口 22172,协议 - TCP,已启用
我已经关闭了防火墙,但仍然出现错误:“(提供商:TCP 提供商,错误 40 - 无法打开与 SQL 服务器的连接)
我尝试了这些连接字符串选项:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = @"tcp:xxx.xxx.x.xx\SQLEXPRESS, 22172";
builder.InitialCatalog = "<database>";
builder.UserID = "sa";
builder.IntegratedSecurity = false;
builder.Password = "<password>";
sqlConnect = builder.ConnectionString;
我也试过这些变化:
builder.DataSource = @"x.xxx.x.xx\SQLEXPRESS, 22172";
builder.DataSource = @"tcp:xxx.xxx.x.xx, 22172";
builder.DataSource = @"xxx.xxx.x.xx, 22172";
还有这些连接字符串:
sqlConnect = @"Data Source = tcp:xxx.xxx.x.xx\SQLEXPRESS,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
sqlConnect = @"Data Source = xxx.xxx.x.xx\SQLEXPRESS,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
sqlConnect = @"Data Source = tcp:xxx.xxx.x.xx,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
sqlConnect = @"Data Source = xxx.xxx.x.xx,22172; Initial Catalog = <database>; User ID = sa; Password = <password>";
另外,这个:
sqlConnect = @"Data Source=xxx.xxx.x.xx\SQLEXPRESS,22172;Initial Catalog=<database>;Persist Security Info=True;User ID=sa;Password=<password>;";
我已经扫描了有关 SO 等的所有相关问题 - 我在某个地方做错了什么?请帮忙
当 运行ning select * from sys.tcp_endpoints
在主机 SQL 上时的输出:因此,ip_address 对两者都是 NULL,端口对两者都是 0,并且 is_dynamic_port 两者都是 1 - 这是相关信息吗?
Dedicated Admin Connection 1 1 2 TCP 2 TSQL 0 STARTED 1 0 1 NULL
TSQL Default TCP 4 1 2 TCP 2 TSQL 0 STARTED 0 0 1 NULL
我已经多次尝试将动态端口更改为静态,我已经删除了配置管理器中的所有 0 或端口号,但 _is_dynamic_port 仍然是 1。事件查看器显示:
Server is listening on [ 'any' <ipv4> 22172].
如果我在 SQL 中 运行 以下内容,也会出现相同的消息:
EXEC xp_ReadErrorLog 0, 1, N'Server is listening on', N'any', NULL, NULL, 'DESC'
开始
为什么 SQL 设置保留在动态端口上?
从你的工作来看,我想你是在 Win PC 上设置的。 所以,...
- Linux 机器呢?它是否允许与 192.168.1.22 建立出站连接?
- 看看
SqlConnectionStringBuilder.IntegratedSecurity
。它应该有一个布尔值。false
如果用户和密码应该用于身份验证 (https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnectionstringbuilder.integratedsecurity?view=dotnet-plat-ext-6.0)。 - 看看
SqlConnectionStringBuilder.UserID
。您的两个代码片段中都缺少它。但是在创建的连接字符串Persist Security Info=True;User ID=sa;Password=<password>;
中提到了 «User ID»、«user» 和 «uid»。请看这里 (https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnectionstringbuilder.userid?view=dotnet-plat-ext-6.0).
检查您的 ISP 是否阻止端口/所有端口。这就是阻止我的原因。