【问题标题】:Frustrating problem connecting to SQL Server Express from C# code从 C# 代码连接到 SQL Server Express 的令人沮丧的问题
【发布时间】:2020-03-04 23:50:12
【问题描述】:

我有一个连接到 SQL Server 数据库默认实例的程序正在工作。我使用 Entity Framework 连接到数据库,该软件现在用作生产软件 - 它很好地支持了我的业务。它是在 Windows Server 2012 上运行的 SQL Server 的付费版本。

我在家中从 git 中检查了相同的代码,并希望在家中使用相同的软件。我已经在我的 PC 上安装了 SQL Server Express(实际上是为了在网络上的第二台 PC 上进行测试)。我使用的是直接从 SQL Server 对象资源管理器复制的连接字符串:

@"Data Source=TSORT\SQLEXPRESS;Initial Catalog=CN2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";

在我的生产软件中,连接字符串是根据设置文件构建的,但我出于测试目的采用了硬编码。

我的安装例程成功地在我的 SQL Server Express 命名实例上创建了自己的数据库。我可以看到数据库和表,包括__MigrationHistory 表,其中包含正确的修订。

但是,当运行此代码时:

CN2.Data.Model.CN2Context context = new Data.Model.CN2Context(builder.ConnectionString);

context.Database.Delete();
context.Database.Create();
var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(new AJSoft.CN2.Model.Migrations.Configuration());
dbMigrator.Update();
context.SaveChanges();

当我随后尝试使用相同的连接字符串连接到数据库时,我得到了众所周知的一般错误:

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

我已经检查了命名管道和 TCP 连接是否在本地和网络上启用。当我尝试在我的 remote 机器上使用数据库时,我什至将我的防火墙 off 关闭了一会儿,但没有任何改善。显然存在某种联系,因为我的空数据库结构首先是正确创建的。

在工作 (SQL Server) 和家庭 (SQL Server Express) 的主要区别在于,在工作中我使用默认实例,而家庭使用命名实例 (COMPUTERNAME\SQLEXPRESS)。所有客户端 PC 都是 Windows 10 并保持全面更新。

这显然令人难以置信,因为这意味着我无法在家用 PC 上使用该软件进行任何工作。任何提示都非常感谢。

编辑:作为参考,我在工作中的调试版本中使用的连接字符串(没有问题):

作为参考,我在工作中的域环境中构建 debug 时使用的连接字符串:

"Data Source=ROHAN;Initial Catalog=\"CN2 Test\";Integrated Security=True;Connect Timeout=10;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"

ROHAN 显然是我的服务器名称,并且使用了默认实例,如您所见。

编辑:我的代码中似乎有一个更根本的问题。我在指定 LocalDb 时遇到了完全同样的问题 - 数据库已创建,但一旦创建,我就无法再次连接到它。我会继续调查。在那之前,我一直在使用 TeamViewer 在家进行开发。

【问题讨论】:

  • 我不清楚是什么问题?
  • 第三个代码 sn-p 包含准确的错误文本。初始创建后我无法连接到数据库。
  • 你能从 SQL 管理工作室连接到 SQL express 吗?
  • 所以你的机器可以连接到数据库来创建它,但是运行程序时却无法连接?对吗?
  • 是的 - 我可以从 SQL 管理工作室连接。当我在本地和远程尝试这个时。我什至可以“刷新”数据库列表并“观察”从 SSMS 创建的空数据库。我还检查了 Windows 用户对数据库拥有完全的管理员权限。我也使用内部身份验证时出现同样的错误。

标签: c# sql-server entity-framework connection-string entity-framework-migrations


【解决方案1】:

尝试两件事: 1. 指定服务器的协议和端口,如下所示: 数据源=tcp:TSORT,1433; 2. 指定 IP 地址而不是服务器名称,如下所示: 数据源=tcp:xxx.xxx.xxx.xxx,1433;

直接连接到端口可以减少在数据库服务器上运行 SQL Browser 服务的需要。

【讨论】:

  • 非常感谢您的建议,我从来没有见过一个连接字符串指定这样添加到我有用的 SQL Server 知识中,即使它这次不起作用!我有疑问(请参阅我对偶数(localdb)失败的编辑),但我今晚会试一试。
  • AJ,谢谢。我使用相同的构造,它还提到了@RedFilter 的here
【解决方案2】:

您是说您已检查本地和网络上是否启用了 TCP/IP...所以您 100% 确定您尝试访问它的 IP 地址(非 127.0. 0.1 地址)是否启用?您的 SQL Express 实例的 TCP/IP 绑定到哪个端口?如果它没有绑定到标准端口 (1433),或者启用了动态端口,那么您需要确保 SQL Browser 服务正在服务器计算机上运行,​​以便客户端知道要连接到哪个端口才能访问该命名实例...所以请检查该服务是否正在运行。

Configure SQL Server to Listen on a Specific TCP Port

About the SQL Server Browser Service

【讨论】:

  • 谢谢 - 我已经在所有 tcp 监听器上指定了标准端口 (1433)。没有喜悦。我已经用更新编辑了这个问题......
【解决方案3】:

好的 - 这感觉更像是一种坦白,而不是一个答案,但我希望社区不会对我做出过于严厉的评判。

我已接受 BreukAJ 的最终答案,因为无论出于任何其他原因,它都是正确的。

在项目的早期测试阶段,我在我的 CN2Context 类上创建了一个构造函数,标记为 #ifdef DEBUG。然后,这个无参数构造函数使用硬编码的连接字符串调用另一个构造函数。这使我能够从 WPF 设计器连接到数据库,这在项目的早期阶段很有用。这是 7 年前的事了,直到我转移到具有新 SQL 服务器的另一台开发机器上才变得明显。

我向所有投入时间和精力解决问题的人道歉...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2011-05-08
    • 2012-04-03
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多