AttachDbFilename有什么问题?

10

显然,在连接字符串中使用AttachDbFilenameuser instance是连接到数据库的不好的方式。我在本地机器上使用SQL Server Express,一切似乎都正常工作。但是,连接到SQL Server的正确方式是什么呢?

感谢您的解释。

2个回答

17
使用“用户实例”意味着SQL Server为您的程序创建了该数据库文件的特殊副本。如果您有两个不同的程序使用相同的连接字符串,则它们会得到两个完全不同的数据库副本。这会导致很多混淆,因为人们会测试使用其程序更新数据,然后在Management Studio中连接到其数据库的另一个副本,并抱怨他们的更新不起作用。这会让他们经历一系列错误的步骤,试图解决错误的问题。 本文更深入地介绍了如何使用此功能, 但请注意第一个注释: “用户实例”功能已被弃用。在SQL Server 2012中,首选替代方案是(按照我的看法):
  1. 创建或附加数据库到一个真正的SQL Server实例上。然后,您的连接字符串只需要指定实例名称、数据库名称和凭据即可。这样,管理工作室、Visual Studio和您的程序将都连接到一个数据库副本,不会出现混乱。

  2. 使用容器进行本地开发。这里有一个由Anna Hoffman和Anthony Nocentino提供的入门视频,我还有其他资源在这里, 在这里在这里。如果您使用的是M1 Mac,您将无法使用完整的SQL Server实例,但如果您可以使用大多数 SQL Server功能(遗漏的功能在此处列出),则可以使用Azure SQL Edge。

  3. 使用SqlLocalDb进行本地开发。我相信我昨天已经向您介绍了这篇文章:开始使用SQL Server 2012 Express LocalDB

  4. 使用SQL Server Compact。我最不喜欢这个选项,因为其功能和语法不同,所以它不一定会为您提供所有您最终想要部署的功能。Compact Edition也已被弃用

当然,如果您使用的是低于SQL Server 2012的版本,则无法使用SqlLocalDb - 因此您应该创建一个真正的数据库并始终使用它。我提到Compact选项只是为了完整性 - 我认为这几乎和使用AttachDbFileName一样糟糕。
编辑:我在这里写了一篇博客:坏习惯:使用AttachDBFileName

啊,好的,现在我明白了:我从连接字符串中删除了UserInstance=true参数,看起来它运行得很好。那么AttachDbFileName参数呢?它有什么危险性? - frenchie
为什么你只想在程序使用数据库时才附加它呢?如果你将数据库附加到SQL Server上,那么你可以随时通过管理工具或其他程序访问它。如果你只在运行时附加它,而你正在积极开发,那么你会得到什么好处呢?如果这是关于资源使用的问题,你可以手动停止SQL Server服务。 - Aaron Bertrand
我不确定这个命令在做什么。现在,我有这个:Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MySiteDB.mdf。我应该如何重写它,以避免在运行时进行附加,并直接访问SQL服务器?我通过在管理工具中附加DB文件来将其附加到SQL服务器。这样好吗? - frenchie
2
AttachDbFileName=[...].mdf 更改为 Initial Catalog=MySite(假设您的数据库逻辑名称为 MySite)。 - Aaron Bertrand
哈哈,刚刚在审查另一个问题时被指到这里。实际上,我几乎喜欢这个紧凑版,至少在高层概念上:它可以与SQLite竞争,但更适合SQL Server生态系统,并且比Access更好的选择适用于桌面应用程序。然而,他们在执行方面完全失败了,存在不兼容的数据类型和太多缺失的功能。 - undefined

-2

如果有人遇到这个问题。

当使用包含AttachDBFileSQLEXPRESS的连接字符串附加数据库时,我注意到此连接仅适用于正在使用数据库的ASP.NET应用程序。当使用System.Data.SqlClient作为提供程序时,该连接确实会在文件级别上阻止所有其他进程的访问。

为了确保连接可与其他进程共享,请改用DataBase来指定连接字符串中的数据库名称。例如:

Data Source=.\SQLEXPRESS;DataBase=PlaCliGen;User ID=XXX;password=ZZZ; Connect Timeout=30 

其中PlaCliGen是SQLEXPRESS服务器知道该数据库的名称(或逻辑名称)。

通过使用AttachDBFile连接到数据文件,提供.mdf文件的路径 (即:将DataBase = PlacliGen替换为AttachDBFile = c:\vs\placligen\app_data\placligen.mdf) 文件被独占地连接,没有其他进程可以连接到该数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接