从 C# 代码连接到 SQL Server Express 时遇到令人沮丧的问题
Frustrating problem connecting to SQL Server Express from C# code
我有一个连接到 SQL 服务器数据库默认实例的程序在工作。我使用 Entity Framework 连接到数据库,该软件现在用作生产软件 - 它很好地支持了我的业务。它是 SQL Server 运行 在 Windows Server 2012 上的付费版本。
我已经在家里检查了来自 git 的相同代码,并希望在家里使用相同的软件。我已经在我的 PC 上安装了 SQL Server Express(实际上,为了测试目的,在网络上的第二台 PC 上)。我正在使用直接从 SQL Server Object Explorer:
复制的连接字符串
@"Data Source=TSORT\SQLEXPRESS;Initial Catalog=CN2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
在我的生产软件上,连接字符串是从设置文件构建的,但我为了测试目的采用了硬编码。
我的设置例程在我的 SQL Server Express 命名实例上成功地在家里创建了数据库。我可以看到数据库和 tables,包括 __MigrationHistory
table,其中包含正确的修订版。
然而,当运行这段代码时:
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();
随后,当我尝试使用相同的连接字符串连接到数据库时,出现了众所周知的一般错误:
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
我已经检查了命名管道和 TCP 连接是否在本地和网络上启用。当我在我的 远程 机器上尝试使用数据库时,我什至暂时关闭了我的防火墙 off 但没有任何改善。显然存在某种联系,因为首先正确创建了我的空数据库结构。
工作(SQL Server)和家庭(SQL Server Express)的主要区别在于,在工作中我使用默认实例而家庭使用命名实例(COMPUTERNAME\SQLEXPRESS
).所有客户端 PC 都是 Windows 10 并保持完全更新。
这显然令人非常沮丧,因为这意味着我无法在家用 PC 上使用该软件进行任何工作。非常感谢任何提示。
编辑:作为参考,我在调试构建中使用的连接字符串(没有问题):
作为参考,我在工作中的域环境中用于调试构建的连接字符串:
"Data Source=ROHAN;Initial Catalog=\"CN2 Test\";Integrated Security=True;Connect Timeout=10;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
ROHAN 显然是我的服务器名称,如您所见,使用了默认实例。
编辑:看来我的代码某处有一个更基本的问题。我在指定 LocalDb 时遇到 完全 相同的问题 - 数据库已创建,但一旦创建,我就无法再次连接到它。我会继续调查。在那之前,我一直在家里使用 TeamViewer 进行开发。
你是说你已经检查过 TCP/IP 在本地和网络上启用...所以你 100% 确定你试图访问它的 IP 地址(a非 127.0.0.1 地址)是否启用? TCP/IP 为您的 SQL Express 实例绑定了哪个端口?如果它没有绑定到标准端口 (1433),或者启用了动态端口,那么您需要确保 SQL 浏览器服务在服务器计算机上是 运行,以便客户端知道哪个连接到该命名实例的端口...因此请检查该服务是否为 运行.
尝试两件事:
1. 指定服务器的协议和端口,如下所示:
数据源=tcp:TSORT,1433;
2. 指定 IP 地址而不是服务器名称,如下所示:
数据源=tcp:xxx.xxx.xxx.xxx,1433;
直接连接到端口可以减少在数据库服务器上安装 SQL 浏览器服务 运行 的需要。
好的 - 这感觉更像是一个忏悔而不是一个答案,但我希望社区不要对我太苛刻。
我已接受 BreukAJ 的最终答案,因为出于任何其他原因,它本来是正确的。
在项目的早期测试阶段,我在我的 CN2Context class 上创建了一个构造函数,标有#ifdef DEBUG。这个无参数的构造函数然后使用硬编码的连接字符串调用另一个构造函数。这使我能够从 WPF 设计器连接到数据库,这在最早的项目阶段很有用。这是 7 年前的事了,只有当我转向另一台带有新 SQL 服务器的开发机器时才变得明显。
我向所有花时间和精力解决这个问题的人道歉,这个问题现在已经解决了...
我有一个连接到 SQL 服务器数据库默认实例的程序在工作。我使用 Entity Framework 连接到数据库,该软件现在用作生产软件 - 它很好地支持了我的业务。它是 SQL Server 运行 在 Windows Server 2012 上的付费版本。
我已经在家里检查了来自 git 的相同代码,并希望在家里使用相同的软件。我已经在我的 PC 上安装了 SQL Server Express(实际上,为了测试目的,在网络上的第二台 PC 上)。我正在使用直接从 SQL Server Object Explorer:
复制的连接字符串@"Data Source=TSORT\SQLEXPRESS;Initial Catalog=CN2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
在我的生产软件上,连接字符串是从设置文件构建的,但我为了测试目的采用了硬编码。
我的设置例程在我的 SQL Server Express 命名实例上成功地在家里创建了数据库。我可以看到数据库和 tables,包括 __MigrationHistory
table,其中包含正确的修订版。
然而,当运行这段代码时:
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();
随后,当我尝试使用相同的连接字符串连接到数据库时,出现了众所周知的一般错误:
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
我已经检查了命名管道和 TCP 连接是否在本地和网络上启用。当我在我的 远程 机器上尝试使用数据库时,我什至暂时关闭了我的防火墙 off 但没有任何改善。显然存在某种联系,因为首先正确创建了我的空数据库结构。
工作(SQL Server)和家庭(SQL Server Express)的主要区别在于,在工作中我使用默认实例而家庭使用命名实例(COMPUTERNAME\SQLEXPRESS
).所有客户端 PC 都是 Windows 10 并保持完全更新。
这显然令人非常沮丧,因为这意味着我无法在家用 PC 上使用该软件进行任何工作。非常感谢任何提示。
编辑:作为参考,我在调试构建中使用的连接字符串(没有问题):
作为参考,我在工作中的域环境中用于调试构建的连接字符串:
"Data Source=ROHAN;Initial Catalog=\"CN2 Test\";Integrated Security=True;Connect Timeout=10;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
ROHAN 显然是我的服务器名称,如您所见,使用了默认实例。
编辑:看来我的代码某处有一个更基本的问题。我在指定 LocalDb 时遇到 完全 相同的问题 - 数据库已创建,但一旦创建,我就无法再次连接到它。我会继续调查。在那之前,我一直在家里使用 TeamViewer 进行开发。
你是说你已经检查过 TCP/IP 在本地和网络上启用...所以你 100% 确定你试图访问它的 IP 地址(a非 127.0.0.1 地址)是否启用? TCP/IP 为您的 SQL Express 实例绑定了哪个端口?如果它没有绑定到标准端口 (1433),或者启用了动态端口,那么您需要确保 SQL 浏览器服务在服务器计算机上是 运行,以便客户端知道哪个连接到该命名实例的端口...因此请检查该服务是否为 运行.
尝试两件事: 1. 指定服务器的协议和端口,如下所示: 数据源=tcp:TSORT,1433; 2. 指定 IP 地址而不是服务器名称,如下所示: 数据源=tcp:xxx.xxx.xxx.xxx,1433;
直接连接到端口可以减少在数据库服务器上安装 SQL 浏览器服务 运行 的需要。
好的 - 这感觉更像是一个忏悔而不是一个答案,但我希望社区不要对我太苛刻。
我已接受 BreukAJ 的最终答案,因为出于任何其他原因,它本来是正确的。
在项目的早期测试阶段,我在我的 CN2Context class 上创建了一个构造函数,标有#ifdef DEBUG。这个无参数的构造函数然后使用硬编码的连接字符串调用另一个构造函数。这使我能够从 WPF 设计器连接到数据库,这在最早的项目阶段很有用。这是 7 年前的事了,只有当我转向另一台带有新 SQL 服务器的开发机器时才变得明显。
我向所有花时间和精力解决这个问题的人道歉,这个问题现在已经解决了...