【问题标题】:An attempt to attach an auto-named database for file ....database1.mdf failed尝试为文件 ....database1.mdf 附加自动命名数据库失败
【发布时间】:2012-09-15 23:19:51
【问题描述】:

在调试我的 Visual Studio 2010 网站时出现以下错误:

尝试为文件 C:\Users...\Desktop\Dpp2012New\App_Data\dppdatabase.mdf 附加自动命名数据库失败。存在同名数据库,或指定文件无法打开,或位于 UNC 共享上。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:尝试为文件 C:\Users...\Desktop\Dpp2012New\App_Data\dppdatabase.mdf 附加自动命名数据库失败。存在同名数据库,或指定文件无法打开,或位于 UNC 共享上。

这是我的web.config 的连接字符串:

<connectionStrings>
    <add name="ApplicationServices" 
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" 
         providerName="System.Data.SqlClient"/>
    <add name="ConnectionString" 
         connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\dppdatabase.mdf;Integrated Security=SSPI" 
         providerName="System.Data.SqlClient"/>
</connectionStrings>

我从我的网站访问它:

Dim connectionString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString

堆栈跟踪显示错误行为:

 Dim conn As New SqlConnection(connectionString)
 Dim dr As SqlDataReader
 conn.Open() 'This is the error line as per stacktrace

我已授予上述文件夹所需的权限,因此它不会是“或无法打开指定文件”的问题。如果我们查看论坛中所有与同一个错误相关的帖子,就可以清楚地发现这个错误的深刻性。但是,没有一个解决方案可以解决我的问题。 我尝试过的一些资源是:

  1. http://weblogs.asp.net/scottgu/archive/2005/08/25/423703.aspx
  2. http://blogs.msdn.com/b/webdevelopertips/archive/2010/05/06/tip-106-did-you-know-how-to-create-the-aspnetdb-mdf-file.aspx
  3. http://forums.asp.net/t/1033225.aspx

我急切地等待解决方案。

【问题讨论】:

    标签: asp.net vb.net sql-server-2008 asp.net-4.0 unc


    【解决方案1】:

    我也有这个问题,很痛苦。我配置了我的连接字符串并设法解决了这个问题。在连接字符串中,我将 AttachDbFilename 属性的值 |DataDirectory|\dbfilename.mdf 替换为文件的路径。 |数据目录|仅当数据库文件位于同一项目内的 App_Data 文件夹中时才能使用。

    因此将 AttachDbFilename 属性更改为 mdf 文件的直接路径,解决了我的问题。

    AttachDbFilename=C:\MyApp\App\DAL\db.mdf

    我希望这对你有用。

    【讨论】:

    • 有什么办法让它相对吗?
    【解决方案2】:

    尝试如下创建连接字符串:

     <add name="ECommerce" connectionString="Data Source=(localdb)\v11.0;Initial Catalog=C:\USERS\dL\DESKTOP\DATABASE\MYSHOP.MDF;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False" providerName="System.Data.SqlClient"/>
    

    它对我有用。

    【讨论】:

    • 这解决了我的问题。使用初始目录而不是 AttachDBFilename
    【解决方案3】:

    <add name="Connections" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
    

    【讨论】:

      【解决方案4】:

      我遇到了类似的错误,但使用的是代码中配置的连接,而不是配置文件。我的解决方案只是添加“Initial Catalog=MyDatabase”部分。我的代码现在看起来像...

      DbConnection connection = new SqlConnection(String.Format(@"Data Source=.\SQLEXPRESS; Integrated Security=SSPI; AttachDbFilename={0}; User Instance=True; Initial Catalog=IPDatabase;", Location));
      

      Location 是 mdb 文件的完整路径,它不一定存在。

      【讨论】:

        【解决方案5】:

        在 .Net 中开发 Web 应用程序时最烦人的错误之一。我在一年前做的一个项目中遇到了这个问题。 这对我有用:我使用 sa 帐户登录到 SQL Management Studio,并将数据库附加到对象资源管理器(数据库 -> 右键单击​​ -> 附加)。 然后我打开了 Security->Logins->[myWindowsUsername] 并编辑了 User Mappings 选项卡,授予 dbowner 对附加数据库的权限。

        我确信您可以在没有 Management Studio 的情况下使用控制台命令来完成这些事情,但我对 T-SQL 不太擅长,因此无法就此提供建议。

        【讨论】:

          【解决方案6】:

          我的项目是 EF 代码优先项目,它会在文件被删除时出现。从包管理器控制台运行Update-Database 使数据库及其正常。

          【讨论】:

            【解决方案7】:

            发生错误是因为AttachDbFilename参数设置为绝对路径,指向错误的文件位置。

            重要的是要知道,数据库 .mdf 文件本身将被复制到构建目标文件夹在每个构建默认情况下,或者,如果配置为 Copy if newer使用文件属性资源管理器,仅当文件版本发生变化时(建议使用Copy if newer 以防止每次构建时都覆盖数据库)。

            要解决此问题,AttachDbFilename 参数应指向当前执行文件夹。最好使用 Visual Studio 环境变量|DataDirectory| 来定义相对路径。

            固定的连接字符串可能如下所示:

            "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Integrated Security=True;Asynchronous Processing=True;User Instance=False;Context Connection=False"
            

            【讨论】:

              【解决方案8】:

              检查您的网络配置文件,可能有多个相同名称的连接字符串

              【讨论】:

              • 我们可以进入聊天吗?我想我就是这种情况!
              【解决方案9】:

              我一直在我的应用程序中尝试 mdf 可移植性,所以我一直在使用

                  public DbContext IoDatabase()
                  {
                      var directory = System.IO.Directory.GetCurrentDirectory();
                      var connectionString = @"Data Source=(localdb)\mssqllocaldb;AttachDbFilename=" + directory + "\\App_Data\\ITIS.mdf;Integrated Security=True;Connect Timeout=30;";
                     return  new NerdDinners(connectionString);
                  }
              

              对于 nerdDinners,我不记得我在哪里找到的,因为

              public class NerdDinners : DbContext
              {
                  public NerdDinners(string connString)
                  {
                      Database.Connection.ConnectionString = connString;
                  }
              }
              

              然后我可以将返回类型用作 DbContext。

              我遇到的主要问题是 GetCurrentDirectory() 获取编译文件路径,而不是项目文件路径,因此部署应设置为 GetCurrentDirectory,并且应在编译时复制 mdf,而不是引用实际的 App_Data。将您的 mdf 包含在您的项目中并在其上设置属性。将副本设置为输出目录。

              【讨论】:

                【解决方案10】:

                我对 EF 也有同样的问题。绝对路径解决方案有效。但是,如果您想将程序移动到新位置,这不是一个好的解决方案。对我来说,这就是问题所在。

                1. VS在debug文件夹中搜索mdf文件
                2. 项目文件夹中有.mdf文件,有时VS同步两者 文件
                3. 由于某种原因,.mdf 文件未同步到调试中

                我的解决方法:

                1. .mdf.ldf 文件复制到临时文件夹
                2. 在 vs/server explorer 中为其建立连接
                3. 添加 ADO.NET 时使用新连接
                4. VS 提议将.mdf 文件复制到项目文件夹中,接受它
                5. 现在.mdf 文件也将出现在调试文件夹中
                6. 删除临时文件夹的连接,新建一个到项目 文件夹

                【讨论】:

                  【解决方案11】:

                  只需将路径更改为新位置即可。

                  你将如何获得路径?

                  转到数据库>右键单击>转到属性>右侧面板数据源在那里,复制该数据源位置并更新到web.config文件中(唯一的路径必须小心并寻找在数据库中的 AttachDbFilename 中)。

                  Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\manish_data\project_practice\sqlbasedprojects\sqlbasedproject\realease\mainproject\App_Data\cruddatabase.mdf;
                  

                  【讨论】:

                    【解决方案12】:

                    我也遇到了同样的错误,我修复了以下问题(我使用 Visual Studio 2019): 点击 Debug > [project name] 调试属性,在左侧边栏中选择构建项。在右侧边栏,导航到输出路径条目并将 bin\debug 更改为 .\

                    【讨论】:

                      【解决方案13】:

                      在我更改后,错误已为我修复

                      ConfigurationManager.ConnectionStrings[0].ConnectionString
                      

                      到这里

                      ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString
                      

                      【讨论】:

                        【解决方案14】:

                        在安装应用程序时,我已将安装文件夹从程序文件更改为 C 目录。那么我的问题就解决了

                        【讨论】:

                          【解决方案15】:

                          我认为原因是在您的数据库目录中,包含一个具有相同名称的 .mdf 文件。所以最好的办法是给出完整的路径,你可以替换 AttachDbFilename。只需简单地获取数据库文件的完整路径并将其分配到 app.config 文件中的 AttachDbFilename 即可。

                          【讨论】:

                            【解决方案16】:

                            在大多数情况下,单元测试项目与主项目是分开的。 如果您的数据库是解决方案的本地数据库,这会导致生成的连接字符串无效,因为它无法找到 app_data 文件夹。

                            您可以只替换 |DataDirectory|如果您需要从单元测试项目连接到它,则在您的主项目中使用您的数据库的相对路径。

                            【讨论】:

                              【解决方案17】:

                              请检查连接字符串上的数据库路径。我有同样的错误信息,后来我发现问题是路径拼写错误。

                              【讨论】:

                                【解决方案18】:

                                到目前为止我已经找到了解决问题的方法,如果您按照以下方式创建 mdf 文件,它对于 Visual Studio 来说就可以了。

                                在服务器Explorar中右键单击数据连接->添加连接->选择Microsoft SQL Server数据库文件并选择数据库名称并选择确定。那么这个问题就不会出现了。 跟随视频: youtube link

                                【讨论】:

                                  【解决方案19】:

                                  看起来有很多原因......这是我的。

                                  线索在错误信息的最后一行...

                                  System.Data.SqlClient.SqlException: '试图附加一个 文件 Q:\Folder\FileName.mdf 的自动命名数据库失败。一个数据库 存在同名文件,或指定文件无法打开,或 位于 UNC 共享上。'

                                  ...or it is located on UNC share.
                                  

                                  在尝试复制生产环境时... 我最初有物理驱动器Q:。在我的开发机器失败后……我重建并创建了一个映射驱动器。 开始出现此错误...然后返回并创建另一个 Q: 分区,问题已解决。

                                  【讨论】:

                                    【解决方案20】:

                                    在我将数据库移动到同一项目中的文件夹后,我遇到了类似的问题。

                                    我最后要做的就是到数据库的属性,复制“身份”下列出的路径并替换“AttachDbFilename =”处的路径。

                                    工作得很好。

                                    【讨论】:

                                      【解决方案21】:

                                      试试这个,它对我有用

                                      try {
                                          String ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\App_Data\Test.mdf;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True";
                                          SqlConnection connection = new SqlConnection(ConnectionString);
                                          connection.Open();
                                          MessageBox.Show("Connection is opened.!!");
                                          connection.Close();
                                      } catch(Exception ex)
                                      {
                                          MessageBox.Show(ex.Message);
                                      }
                                      

                                      【讨论】:

                                        【解决方案22】:

                                        TLDR:可能需要在多个文件中进行 HasanG 提到的更改,例如我的 App.config 和 Settings.Designer。

                                        要补充 HasanG 的答案,您可能需要在多个位置更改 ConnectionString 的路径。就我而言,我没有在调试器的两次运行之间获得数据持久性,并且更改了我的 Settings.Designer 文件中定义的 ConnectionString 解决了这个问题。但是,在关闭并重新打开 Visual Studio 并再次运行调试器后,我发现在 Visual Studio 关闭后我没有获得持久性。我要么得到一个空的 DataGridView,要么在构建时得到一个错误,说明如下:

                                        *An attempt to attach an auto-named database for file <database file path in debug folder> failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.*
                                        

                                        然后,我在整个项目解决方案中搜索该文件路径的实例,发现它也在 App.config 文件中使用。一旦我更改了该文件以及 Settings.Designer 文件中的路径,我就能够在调试器的多次运行之间以及 Visual Studio 本身的多次运行之间在我的 DataGridView 中保持数据持久性。希望这对某人有帮助!我在这个上面拔了很多头发。

                                        编辑:制作这三个文件,Settings.Settings 文件也必须更新。

                                        【讨论】:

                                          【解决方案23】:

                                          在 .net core 5 中用于在 Data 文件夹中创建 Db.mdf 文件:

                                          • appsettings.json 中的连接字符串:

                                          "DefaultConnection": "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=projectPath\\Data\\Db.mdf;Integrated Security=True;Connect Timeout=30"

                                          • startup.cs 中的options.UseSqlServer:

                                            var projectPath = Directory.GetCurrentDirectory();

                                            services.AddDbContext(选项 => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection").Replace("projectPath", projectPath)));

                                          【讨论】:

                                            【解决方案24】:

                                            我有同样的问题,我想我想通了。在连接字符串中确保连接字符串看起来像这样:

                                            <connectionStrings>
                                              <add name="ApplicationServices"
                                                connectionString="data source=.\SQLEXPRESS;
                                                                  Integrated Security=SSPI;
                                                                  AttachDBFilename=|DataDirectory|\aspnetdb.mdf;
                                                                  User Instance=true"
                                                providerName="System.Data.SqlClient" />
                                              <add 
                                                name="NorthwindConnectionString1" 
                                                connectionString="Data Source=localhost;
                                                                  Initial Catalog=Northwind;
                                                                  Integrated Security=True" 
                                                providerName="System.Data.SqlClient" />
                                            </connectionStrings> 
                                            

                                            现在,第一个

                                            <add 
                                              name="ApplicationServices" 
                                              connectionString="data source=.\SQLEXPRESS;
                                                                Integrated Security=SSPI;
                                                                AttachDBFilename=|DataDirectory|\aspnetdb.mdf;
                                                                User Instance=true"
                                              providerName="System.Data.SqlClient" />
                                            

                                            是默认出现在 web.config 中的内容。保持不变,并添加另一个连接字符串

                                             <add
                                               name="NorthwindConnectionString1" 
                                               connectionString="Data Source=localhost;
                                                                 Initial Catalog=Northwind;
                                                                 Integrated Security=True"
                                               providerName="System.Data.SqlClient" />
                                            

                                            使用您的参数。这对我有用。希望对您有所帮助。

                                            【讨论】:

                                            • 不是答案 - 公式化也无济于事。
                                            猜你喜欢
                                            • 2012-02-03
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            相关资源
                                            最近更新 更多