如何通过互联网连接到远程 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 建立相同的连接

我有:

我已经关闭了防火墙,但仍然出现错误:“(提供商: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 上设置的。 所以,...

  1. Linux 机器呢?它是否允许与 192.168.1.22 建立出站连接?
  2. 看看SqlConnectionStringBuilder.IntegratedSecurity。它应该有一个布尔值。 false 如果用户和密码应该用于身份验证 (https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnectionstringbuilder.integratedsecurity?view=dotnet-plat-ext-6.0)。
  3. 看看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 是否阻止端口/所有端口。这就是阻止我的原因。