AttachDbFilename有什么问题

时间:2012-06-24 15:34:50

标签: asp.net sql-server

显然,在连接字符串中使用AttachDbFilenameuser instance是连接数据库的一种不好方法。我在我的本地机器上使用SQL server express,这一切似乎都运行正常。但是,连接到SQL服务器的正确方法是什么呢?

感谢您的解释。

2 个答案:

答案 0 :(得分:11)

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

This article goes into more depth about how to use this feature,但请注意第一个注意事项: User Instance功能已被弃用。在SQL Server 2012中,首选的替代方案是(按此顺序,恕我直言):

  1. 创建数据库或将数据库附加到SQL Server的实际实例。然后,您的连接字符串只需指定实例名称,数据库名称和凭据。由于Management Studio,Visual Studio和您的程序都将连接到数据库的单个副本,因此不会出现混淆。

  2. 使用SqlLocalDb进行本地开发。我相信我昨天向你提到了这篇文章:“Getting Started with SQL Server 2012 Express LocalDB。”

  3. 使用SQL Server Compact。我最喜欢这个选项,因为功能和语法不一样 - 所以它不一定会为你提供你最终想要部署的所有功能。 Compact Edition is also deprecated, so there's that
  4. 当然,如果您使用的是版本< SQL Server 2012,SqlLocalDb不是一个选项 - 因此您应该创建一个真实的数据库并一致地使用它。我只提到Compact选项的完整性 - 我认为这与使用AttachDbFileName几乎一样糟糕。

    编辑:我在这里写了这篇博文:

答案 1 :(得分:-1)

如果有人遇到问题。

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

为了确保连接可与其他进程共享 而是使用DataBase在连接字符串中指定数据库名称 示例或连接字符串:

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)文件是专门连接的,没有其他进程可以连接到数据库。