【问题标题】:Cannot connect to SQL Server Express database from an UWP app无法从 UWP 应用连接到 SQL Server Express 数据库
【发布时间】:2020-11-17 09:18:33
【问题描述】:

我有一个需要连接到 SQL Server Express 数据库的 UWP 应用。在我的开发盒上,我没有任何问题。

在客户端 PC 上,我安装了 SQL Server Express,创建了数据库,设置了用户和登录。

当我运行应用程序并尝试连接到数据库时,出现错误:

与 SQL Server 建立连接时出现与网络相关或特定于实例的错误。
服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。
(提供者:TCP 提供者,错误:40 - 无法打开与 SQL Server 的连接)

我用来连接的代码是:

...
using (SqlConnection connection = new SqlConnection(ConnectionStringTextBox.Text.Trim()))
{
    try
    {
        connection.Open();
        MessageBox.Show("Connected successfully!");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
...

在客户端计算机上的桌面应用程序上使用相同的代码,连接成功。

我已将 UWP 应用设置为使用版本 1809 的 Windows 10。

客户端和我的开发盒都是2004版。

Package.appxmanifest 文件已检查以下功能:

  • 企业认证
  • 互联网(客户端和服务器)
  • 互联网(客户端)
  • 专用网络(客户端和服务器)

Windows 防火墙打开了正确的端口。在 SSMS 中,我启用了允许远程连接,启用了 TCP。

我不知道自己做错了什么或出了什么问题。同样的 UWP 应用在我的开发盒上运行良好。

感谢任何建议。

【问题讨论】:

  • 那么,您是否调试/打印/msgbox 存储在ConnectionStringTextBox.Text.Trim() 中的值?价值是什么?当您尝试在运行 UWP 应用的同一台计算机上从 SSMS 连接到该服务器/实例名称时会发生什么?提示:这可能与应用程序无关,当然也与 Windows 版本无关。
  • 我需要查看连接字符串。您需要使用使用 Windows 凭据的 Integrated Security = true。首先在客户端机器上使用 SQL Server Management Studio 连接到数据库以确保凭据有效。除非第一个 SSMS 工作,否则您的 c# 代码将无法工作。然后,一旦你让 SSMS 工作,c# 将很容易。集成安全性要求本地和远程计算机上的凭据相同。因此,您需要将客户端和服务器放在同一组中才能使 Windows 凭据正常工作。用户需要同时位于客户端和服务器计算机中。我通常创建一个 windows 用户组。
  • @jdweng OP 确实必须使用集成安全性。我不知道你从哪里得到这个想法。我同意这更方便,意味着我们可以避免使用密码,但是在受控的 AD 域环境之外或通过 Internet 连接到 SQL Server 时(这很愚蠢,但有时是必要的),您必须使用登录+密码身份验证。跨度>
  • SQL Server 位于远程计算机上时,登录名/密码可能无效。

标签: c# sql-server xaml uwp uwp-xaml


【解决方案1】:

如果您尝试连接到同一台计算机上的 SQL Server 实例,它将无法正常工作,因为UWP applications are sandboxed and cannot connect to localhost over TCP/UDP - 而与远程计算机的连接会成功。 我认为这很愚蠢,但这是设计使然

作为一种解决方法,您可以将 SQL Server 配置为使用共享内存或命名管道,这些方法应该可以工作。

更新:

我忘记了that there is now a Capability you can add to your AppX manifest to enable local-loopback connections(仅适用于 TCP,it doesn't work for UDP)。

【讨论】:

  • 你的意思是他们只能连接到本地主机吗?如果他们可以连接到任何本地主机,这与沙箱相反,如果是这样的话,我同意你的看法——那太愚蠢了。
  • @AaronBertrand 正确,他们可以连接到任何除了 localhost。争论是用户的计算机可能正在运行编写不佳的 非 UWP 程序,这些程序具有可能被恶意 UWP 应用程序利用的本地环回服务器(因为 Microsoft 出于某种原因期望 UWP 成为作为 Web 应用程序很常见,并希望以牺牲可用性为代价先发制人地使平台变得超级安全——愚蠢的愚蠢的 IMO)。
【解决方案2】:

你可以试试这个例子,了解如何在 uwp 应用程序中连接到 sql server,并尝试在你的客户端电脑上执行相同的步骤,希望它有效: https://docs.microsoft.com/en-us/windows/uwp/data-access/sql-server-databases#first-set-up-your-solution

【讨论】:

    【解决方案3】:

    我尝试了所有可以在网上找到的方法,更改 sql server 防火墙设置、sql server tcp/ip 设置、更改 sql server 浏览器防火墙设置,但没有一个对我有用。

    我确实读过有人说在 UWP 中打开环回功能,但我没有看到我拥有的目标窗口版本的选项。最后,我终于通过运行以下命令让它工作了

    checknetisolation loopbackexempt -a -n=YourAppPackageName
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多