【发布时间】:2022-01-17 16:15:17
【问题描述】:
我有一台装有 SQL Server Express 的 Windows 10 PC,我已经设置了远程连接,分配了一个固定端口(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;
那么,正常的防火墙入站规则、远程连接设置等工作,对吗?我现在希望能够从位于不同互联网(来自不同位置/城镇..)上的 Windows PC 上建立相同的连接
我有:
- 为主机 PC 所在的路由器获取固定 IP
- 修复了 主机PC的本地IP - 192.168.1.22 根据this 链接
- 在 IP2 下为“SQLEXPRESS 协议 - TCP/IP - IP”设置 IP 地址”到 192.168.1.22
- 将 SQL Server Windows NT - 64 位添加为 防火墙中允许的应用
- 在 SQL Server 中启用 TCP/IP 和命名管道 带有开始 - 运行 - CLICONFG.exe 的客户端网络实用程序
- 设置端口 在路由器上转发:服务端口 22172,IP 地址: 192.168.1.22,内部端口 22172,协议 - TCP,已启用
我已关闭防火墙,但仍然收到错误:“(提供程序:TCP 提供程序,错误 40 - 无法打开与 SQL Server 的连接)
我尝试这些连接字符串选项:
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 等的所有相关问题 - 我在某处做错了什么?请帮忙
在主机 PC SQL 上运行select * from sys.tcp_endpoints 时的输出:因此,ip_address 对于两者都是 NULL,port 对于两者都是 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 设置保留在动态端口上?
【问题讨论】:
-
听起来您需要在边缘路由器上进行端口转发。正确的连接字符串是
xxx.xxx.x.xx,22172,但如果您从不同的 LAN 连接,则相关的 IP 地址将是边缘路由器的地址。您还可以使用动态 DNS,以避免必须为其获取静态 IP -
如前所述,我正在做端口转发。并使用边缘路由器的 IP 地址进行连接
-
select * from sys.tcp_endpoints的结果是什么? -
@lptr 请查看相关更新详情
-
..似乎命名实例正在动态端口上运行。一旦将其设置为固定的 22172 端口..并且您可以使用“192.168.1.22, 22172”(来自 win 或 linux 机器)连接到实例..然后在路由器上进行 port_forwarding 之后..应该可以使用internetIP,22172进行连接。在连接测试期间,您还可以在sql实例的windows主机上短暂禁用防火墙。
标签: c# sql-server tcp