【问题标题】:Error on UWP trying to connect to SQL Server Express via EFCoreUWP 尝试通过 EFCore 连接到 SQL Server Express 时出错
【发布时间】:2020-06-30 16:15:01
【问题描述】:

团队, 这真让我抓狂。我在启动 UWP 应用程序时总是收到此错误:

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

内部异常:

Microsoft.Data.SqlClient.SqlException H结果=0x80131904 消息=建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供程序:共享内存提供程序,错误:40 - 无法打开与 SQL Server 的连接) Source=Core Microsoft SqlClient 数据提供程序 堆栈跟踪: 在 Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity 标识,SqlConnectionString connectionOptions,SqlCredential 凭据,对象 providerInfo,字符串 newPassword,SecureString newSecurePassword,布尔重定向用户实例,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,布尔 applyTransientFaultHandling,字符串 accessToken,DbConnectionPool 池,SqlAuthenticationProviderManager sqlAuthProviderManager ) 在 Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象 poolGroupProviderInfo,DbConnectionPool 池,DbConnection owningConnection,DbConnectionOptions userOptions) 在 Microsoft.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool 池,DbConnection owningObject,DbConnectionOptions 选项,DbConnectionPoolKey poolKey,DbConnectionOptions 用户选项) 在 Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject,DbConnectionOptions userOptions,DbConnectionInternal oldConnection) 在 Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject,DbConnectionOptions userOptions,DbConnectionInternal oldConnection) 在 Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,布尔allowCreate,布尔onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal& 连接) 在 Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 重试,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& 连接) 在 Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource1 retry, DbConnectionOptions userOptions) at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试,DbConnectionOptions userOptions) 在 Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 retry) at Microsoft.Data.SqlClient.SqlConnection.Open() at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable1.Enumerator.InitializeReader(DbContext _,布尔结果) 在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState 状态,Func3 operation, Func3 verifySucceeded) 在 Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable1.Enumerator.MoveNext() at System.Collections.Generic.List1.AddEnumerable(IEnumerable1 enumerable) at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 源) 在 UWP_EF_i9.MainPage.Page_Loaded(Object sender, RoutedEventArgs e) 在 E:\Users\Massimo\OneDrive\Development\Source\UWP EF i9\UWP EF i9\MainPage.xaml.cs:line 35

内部异常 1: Win32Exception: 访问被拒绝

由于 UWP 中的 EFCore 无法对数据库进行 dbscaffold,因此按照此处找到的建议,我做了一个 EF.Core WPF 应用程序,搭建了创建类的数据库...在 UWP 应用程序中导入了生成的类(重命名了命名空间在适用的情况下)。

在 UWP 应用程序中,我添加了 Microsoft.EntityFrameworkCore 和 Microsoft.EntityFrameworkCore.SQLServer 并添加了 Enterprise Capability: Enterprise Authentication

所以一切都应该没问题......但是......它不起作用。在 WPF 中正常工作的完全相同的 LINQ 查询给了我 UWP 中的错误

有什么想法吗?我错过了什么?

--- 编辑 1

我什至从这个页面添加了代码:

Use a SQL Server database in a UWP app connectionString = "Data Source=YourServerName\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI";

我的情况是这样:

            try
        {
            using (SqlConnection conn = new SqlConnection((App.Current as App).ConnectionString))
            {
                conn.Open();
                if (conn.State == System.Data.ConnectionState.Open)
                {
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "Select * from tAPP";
                        using (SqlDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                            }
                        }
                    }
                }
            }
        }

但是 conn.Open() 失败并显示相同的消息

【问题讨论】:

    标签: sql-server uwp entity-framework-core database-connection ef-core-3.0


    【解决方案1】:

    我发现了问题:( 它在这里解释: Use a SQL Server database in a UWP app

    在以下部分:连接到您的数据库时遇到问题?

    默认情况下禁用 TCP/IP 协议,必须启用。 现在 WPF 中的同一个应用程序怎么可能工作,VS2019 能够连接(更不用说 SSMS ......)并且只有 UWP 不连接对我来说是一个谜......但现在它工作了!

    【讨论】:

    • 啊。默认情况下,您使用共享内存协议连接到本地 SQL 实例,该协议似乎在 UWP 中根本不起作用。所以你必须启用 TCP/IP。如果我在连接字符串Server=lpc:localhost;... 中强制共享内存,我会遇到同样的失败。
    • 这解决了“谜团”:)。可能是由于 UWP 沙盒……还是缺少共享内存的产品差距?
    • 我认为是 UWP 沙盒。 .NET Core 上的 SqlClient 可以使用共享内存网络协议。
    【解决方案2】:

    默认情况下,UWP 应用没有网络访问权限。见:

    能力

    为了使用网络,您必须添加适当的 应用清单的功能元素。如果没有网络能力 在您的应用清单中指定,您的应用将没有网络 能力,任何连接到网络的尝试都会失败。

    Networking basics - UWP applications

    【讨论】:

    • 我已经添加了专用网络(客户端和服务器)以及互联网(客户端和服务器),但错误仍然存​​在:(
    • 在 Win 10 1909 上运行,我刚刚使用 EF Core 3.1.2 创建了一个简单的 UWP(最低版本 1809)应用程序,启用了 privateNetworkClientServer 和 enterpriseAuthentication,并成功连接到本地 SQL Server 实例和 Azure SQL 数据库。
    • 谢谢大卫,我已经写了一个答案,因为似乎必须在服务器端启用 TCP/IP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多