显然,在连接字符串中使用AttachDbFilename
和user instance
是连接数据库的一种不好方法。我在我的本地机器上使用SQL server express,这一切似乎都运行正常。但是,连接到SQL服务器的正确方法是什么呢?
感谢您的解释。
答案 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中,首选的替代方案是(按此顺序,恕我直言):
创建数据库或将数据库附加到SQL Server的实际实例。然后,您的连接字符串只需指定实例名称,数据库名称和凭据。由于Management Studio,Visual Studio和您的程序都将连接到数据库的单个副本,因此不会出现混淆。
使用SqlLocalDb
进行本地开发。我相信我昨天向你提到了这篇文章:“Getting Started with SQL Server 2012 Express LocalDB。”
当然,如果您使用的是版本< 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)
文件是专门连接的,没有其他进程可以连接到数据库。