簡體   English   中英

如何通過 inte.net 連接到遠程 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;

那么,正常的防火牆入站規則、遠程連接設置等是否有效,對嗎? 我現在希望能夠從位於不同 inte.net(來自不同位置/城鎮)的 Windows PC 建立相同的連接。

我有:

  • 為主機 PC 所在的路由器獲取固定的 IP
  • 根據鏈接修復主機 PC 的本地 IP - 192.168.1.22
  • 將 IP2 下的“SQLEXPRESS 協議 - TCP/IP - IP 地址”的 IP 設置為 192.168.1.22
  • 在防火牆中添加了 SQL 服務器 Windows NT - 64 位作為允許的應用程序
  • 通過開始 - 運行 - CLICONFG.exe 在 SQL 服務器客戶端網絡實用程序中啟用 TCP/IP 和命名管道
  • 在路由器上設置端口轉發:服務端口 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 等的相關問題 - 我在某個地方做錯了什么? 請幫忙

Output 當select * from sys.tcp_endpoints時:因此,兩者的 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

我曾多次嘗試將動態端口更改為 static,我已刪除配置管理器中的所有 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'

GO

為什么 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>; 作為«用戶ID»,«用戶»和«uid»。 請參閱此處( https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnectionstringbuilder.userid?view=dotnet-plat-ext-6.0 )。

檢查您的 ISP 是否阻止端口/所有端口。 這就是阻止我的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM