【问题标题】:what's the issue with AttachDbFilenameAttachDbFilename 有什么问题
【发布时间】:2021-06-09 18:57:34
【问题描述】:

显然,在连接字符串中使用AttachDbFilenameuser instance 是连接数据库的不好方法。我在我的本地机器上使用 SQL server express,它似乎工作正常。但是,那么连接到 SQL Server 的正确方法是什么?

感谢您的解释。

【问题讨论】:

    标签: asp.net sql-server


    【解决方案1】:

    使用User Instance 意味着SQL Server 正在创建该数据库文件的特殊副本以供您的程序使用。如果您有两个不同的程序使用相同的连接字符串,它们将获得两个完全不同的数据库副本。这会导致很多混乱,因为人们将使用他们的程序测试更新数据,然后在 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. 使用容器进行本地开发。这是一个很棒的starter video by Anna Hoffman and Anthony Nocentino,我还有一些其他资源hereherehere。如果您使用的是 M1 Mac,您将无法使用成熟的 SQL Server 实例,但如果您可以使用大多数 SQL Server 功能,则可以使用 Azure SQL Edge( omissions are enumerated here)。

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

    4. 使用SQL Server Compact。我最不喜欢这个选项,因为功能和语法不一样 - 所以它不一定会为您提供您最终想要部署的所有功能。 Compact Edition is also deprecated, so there's that.

    当然,如果您使用的是 SqlLocalDb 不是一个选项 - 所以您应该创建一个真正的数据库并始终如一地使用它。为了完整性,我只提到了 Compact 选项 - 我认为这几乎与使用 AttachDbFileName 一样糟糕。

    编辑:我在这里写过博客:

    【讨论】:

    • 啊好的,现在我明白了:我从连接字符串中删除了 UserInstance=true 参数,它似乎工作正常。那么 AttachDbFileName 参数呢?那个有什么危险?
    • 为什么您只想在程序使用数据库时附加数据库?如果您将数据库附加到您的 SQL Server,那么您可以随时通过 Management Studio 或其他程序访问它。您在积极开发时仅在运行时附加它可以获得什么?如果是资源使用问题,可以手动停止SQL Server服务。
    • 我不确定该命令在做什么。现在,我有这个: Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MySiteDB.mdf 。我应该如何重写它,以避免附加到运行时,而是直接转到 SQL Server?我通过将数据库文件附加到管理工作室中将其附加到 SQL 服务器。这样好吗?
    • AttachDbFileName=[...].mdf 更改为Initial Catalog=MySite(假设您为数据库提供了逻辑名称MySite)。
    【解决方案2】:

    万一有人遇到问题。

    使用包含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) 文件以独占方式连接,没有其他进程可以连接到数据库。

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 2010-12-23
      • 2010-10-24
      • 2011-10-04
      • 2011-10-08
      • 2013-04-07
      相关资源
      最近更新 更多