10

Apparently, using AttachDbFilename and user instance in your connection string is a bad way to connect to a DB. I'm using SQL server express on my local machine and it all seems to work fine. But what's the proper way to connect to SQL server then?

Thanks for your explanation.

4

2 回答 2

17

UsingUser Instance意味着 SQL Server 正在创建该数据库文件的特殊副本以供您的程序使用。如果您有两个不同的程序使用相同的连接字符串,它们将获得两个完全不同的数据库副本。这会导致很多混乱,因为人们将使用他们的程序测试更新数据,然后在 Management Studio 中连接到他们数据库的不同副本,并抱怨他们的更新不起作用。这使他们经历了一系列有缺陷的野鹅追逐步骤,试图解决错误的问题。

本文更深入地介绍了如何使用此功能,但请注意第一个注意事项:User Instance功能已被弃用。在 SQL Server 2012 中,首选的替代方案是(按此顺序,恕我直言):

  1. 创建或将您的数据库附加到 SQL Server 的真实实例。然后,您的连接字符串将只需要指定实例名称、数据库名称和凭据。不会有混淆,因为 Management Studio、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 紧凑。我最不喜欢这个选项,因为功能和语法不一样 - 所以它不一定会为您提供您最终想要部署的所有功能。精简版也已被弃用,所以就是.

当然,如果您使用的版本 < SQL Server 2012,SqlLocalDb则不是一种选择——因此您应该创建一个真正的数据库并始终如一地使用它。为了完整性,我只提到了 Compact 选项——我认为这几乎和使用AttachDbFileName.

编辑:我在这里写过关于这个的博客:

于 2012-06-24T15:58:27.617 回答
-2

以防有人遇到问题。

AttachDBFile 当使用包含with的连接字符串附加数据库时SQLEXPRESS,我注意到此连接是使用数据库的 ASP.NET 应用程序独有的。当作为提供者建立连接时,该连接确实阻止了对文件级别上所有其他进程的访问System.Data.SqlClient

为了确保连接可与其他进程共享,请改用 DataBase 在连接字符串 Example 或连接字符串中指定数据库名称:

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

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

通过使用 AttachDBFile 连接到数据库,该文件提供了 .mdf 文件的路径,该文件 (namely : replacing DataBase = PlacliGen by AttachDBFile = c:\vs\placligen\app_data\placligen.mdf) 以独占方式连接,并且没有其他进程可以连接到数据库。

于 2017-05-11T13:38:24.820 回答