代码之家  ›  专栏  ›  技术社区  ›  AJ.

从C代码连接到SQL Express时遇到了令人沮丧的问题

  •  1
  • AJ.  · 技术社区  · 4 年前

    我有一个连接到SQLServer数据库默认实例的程序。我连接到数据库使用实体框架和软件现在被用作生产软件-它支持我的业务非常好。它是运行在Windows Server 2012上的SQL Server付费版本。

    我已经在家里从git签出了相同的代码,希望能在家里使用相同的软件。我已经在我的电脑上安装了SQLServerExpress(实际上,为了测试的目的,在网络上的第二台电脑上安装了SQLServerExpress)。我使用的是直接从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的连接)

    遥远的 我甚至求助于打开我的防火墙

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

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

    作为参考,我使用的连接字符串 调试 在我的工作域环境中生成:

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

    编辑:似乎我的代码中有一个更基本的问题。我明白了 确切地

    0 回复  |  直到 4 年前
        1
  •  0
  •   BreukAJ    4 年前

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

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

        2
  •  0
  •   Maximillian C.    4 年前

    你是说你已经检查了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

        3
  •  0
  •   AJ.    4 年前

    我接受BreukAJ的答案作为最终的答案,因为其他任何原因,它都是正确的。

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

    我向任何花时间和精力解决这个问题的人道歉,这个问题现在已经解决了。。。