【问题标题】:Changing connection string name causes DataReader open error更改连接字符串名称会导致 DataReader 打开错误
【发布时间】:2023-03-15 08:14:01
【问题描述】:

我是 MVC 的新手,我刚刚构建了我的第一个应用程序,即将进入测试服务器。但是,我遇到了一个奇怪的问题,关于我卡住的连接字符串名称,希望有人能帮助我。问题来了:

我有一个如下所示的 DBContext 类:

using NVD.Models;
using System.Data.Entity;
namespace NVD.DAL
{
    public class NVDContext : DbContext
    {
        public DbSet<Patient> Patients { get; set; }
        public DbSet<Conscent> Conscents { get; set; }
        ... some more DBSets here ...
    }
}

在编写应用程序时,我使用了如下所示的连接字符串:

<add name="NVD" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\tnie0118\Documents\Visual Studio 2017\Projects\NVD\NVD\App_Data\NVD.DAL.NVDContext.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />

我已经读到连接字符串名称必须与 DBContext 类的名称匹配,我相信在我的情况下是 NVDContext。但是,在 LocalHost 上运行时一切正常,如果我将连接字符串名称更改为“NVDContext”,每次尝试使用延迟加载时都会出错:

已经有一个打开的 DataReader 与此命令关联 必须先关闭。”我可以通过添加来摆脱错误 ".ToList()

无处不在,但这将是一项巨大的工作,而且我相信问题确实是其他问题。

我想,这样我就可以保持原样了。但是,我现在必须将数据库移动到 SQL 服务器,并且为了让我的应用程序使用 SQL 服务器上的数据库,我有以下连接字符串:

<add name="NVDContext" connectionString="Data Source=SERVERNAME\SERVERNAME;Integrated Security=False;User ID=xxxx;Password=xxxx; Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient"/>

因此,如果我使用“NVDContext”名称,应用程序只会连接到 SQL 服务器中的数据库,但这会给我打开数据读取器错误,并且如果我尝试使用“NVD”作为连接字符串名称该应用程序尝试连接到我的 C 驱动器上的本地数据库(即使我注释掉本地连接字符串)。

所以我在这里真的很茫然。希望有人可以帮助我。提前一百万谢谢。 /巨魔

【问题讨论】:

  • Data Source=SERVERNAME\SERVERNAME => 这应该只是Data Source=SERVERNAME 还是Data Source=SERVERNAME\INSTANCENAME?还要检查可用选项here - 也许您也需要指定Initial Catalog
  • 另外,已经有一个打开的 DataReader 与此命令关联,必须先关闭 错误表明您必须通过在连接字符串中设置 MultipleActiveResultSets=True 来启用 MARS,然后您不要处理多个结果集时,不需要到处使用.ToList()
  • @TetsuyaYamamoto 这可能是需要做的事情,但我不建议在没有更多信息的情况下这样做,因为它取决于数据库技术等。这也是未正确处理连接的症状并且没有正确使用async/await。将它添加到您的连接字符串可能会使这些问题变得更糟。
  • 感谢您的建议。我相信我以某种方式拥有正确的连接字符串,因为我能够很好地连接和添加新记录。但是,只有在控制器中的动作是非常简单的。我真的不明白这个。设置 MultipleActiveResults = true 确实会有所不同。但是,您能否指导我是否应该解决一些潜在的问题而不是这个修复? /巨魔

标签: asp.net-mvc connection-string


【解决方案1】:

从数据库中检索到数据后关闭 DataReader,为每个事务使用打开和关闭连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多