无法从UWP应用程序连接到SQL Server Express数据库

3
我有一个UWP应用程序,需要连接到SQL Server Express数据库。在我的开发环境中,没有任何问题。
在客户端PC上,我安装了SQL Server Express,创建了数据库,并设置了用户和登录信息。
当我运行应用程序并尝试连接到数据库时,出现了错误:
“在建立到 SQL Server 的连接时发生与网络相关或特定于实例的错误。 找不到服务器或无法访问。请验证实例名称是否正确且 SQL Server 已配置允许远程连接。 (提供程序:TCP Provider, error: 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应用程序以使用Windows 10版本1809。

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

Package.appxmanifest文件中勾选了以下功能:

  • 企业级身份验证
  • Internet(客户端和服务器)
  • Internet(仅限客户端)
  • 专用网络(客户端和服务器)

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

我不知道我做错了什么或出了什么问题。 这个同样的UWP应用程序在我的开发机上运行得很好。

感谢任何建议。


2
你调试/打印/使用msgbox查看了ConnectionStringTextBox.Text.Trim()中存储的值吗?这个值是什么?当你尝试从运行UWP应用程序的同一台机器上的SSMS连接到该服务器/实例名称时会发生什么?提示:这可能与应用程序特定的问题无关,当然也不是Windows版本的问题。 - Aaron Bertrand
你看过这个吗?https://dev59.com/B1wY5IYBdhLWcg3wM1fK - Dai
我需要查看连接字符串。您需要使用Integrated Security = true,这将使用Windows凭据。首先在客户端机器上使用SQL Server Management Studio连接到数据库,以确保凭据有效。除非首先SSMS工作,否则您的c#代码将无法正常工作。然后,一旦您让SSMS工作起来,c#就会变得容易。集成安全要求本地和远程计算机上的凭据相同。因此,您需要将客户端和服务器放入同一组中,以使Windows凭据正常工作。用户需要在客户端和服务器机器上都存在。我通常创建一个Windows用户组。 - jdweng
@jdweng,原帖作者不必须使用集成安全性。我不知道你从哪里得到这个想法。我同意它更方便,可以避免密码,但在受控的AD域环境之外或连接到互联网上的SQL Server时(这很愚蠢,但有时是必要的),您必须使用登录名+密码身份验证。 - Dai
当 SQL Server 在远程机器上时,登录/密码可能无法正常工作。 - jdweng
这是我使用的连接字符串:Data Source=myMachineName,49172\SQLEXPRESS; Initial Catalog=TestDb; User Id=myId; Password=123456; 我也尝试了不同的端口号... - Andrew Chang
3个回答

0

我尝试了网上能找到的所有方法,改变了SQL Server防火墙设置、SQL Server TCP/IP设置,还改变了SQL Server浏览器防火墙设置,但都没有解决我的问题。

我看到有人说要在UWP中开启回环功能,但是我在我使用的目标窗口版本中没有找到这个选项。最后,我通过运行以下命令终于解决了问题。

checknetisolation loopbackexempt -a -n=YourAppPackageName

enter image description here


0

0

如果您正在尝试连接到同一台计算机上的 SQL Server 实例,则无法工作,因为 UWP 应用程序被沙盒化,无法通过 TCP/UDP 连接到本地主机 - 而对远程计算机的连接将成功。 我认为这很愚蠢,但这是按设计来的

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

更新:

我忘记了 现在有一个功能可以添加到您的 AppX 清单中,以启用本地环回连接(仅适用于 TCP,它不适用于 UDP)。


你的意思是他们只能连接到本地主机吗?如果他们可以连接到除本地主机之外的任何东西,那就有点像相反的沙箱了,如果是这种情况,我同意你 - 那很愚蠢。 - Aaron Bertrand
1
@AaronBertrand 正确,它们可以连接到任何东西,除了 localhost。论点是用户的计算机可能运行着编写不良的非UWP程序,这些程序具有本地回环服务器,可能会被恶意的UWP应用程序利用(因为微软出于某种原因预期UWP将变得像Web应用程序一样普遍,并希望在可用性方面预先使平台超级安全 - 在我看来非常愚蠢)。 - Dai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接