尝试为文件.... database1.mdf附加自动命名的数据库失败

时间:2012-09-24 13:26:39

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

调试我的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

stacktrace将错误行显示为:

 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
  4. 我急切地等待解决方案。

24 个答案:

答案 0 :(得分:26)

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

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

<强> AttachDbFilename = C:\ MyApp的\应用\ DAL \ db.mdf

我希望这适合你。

答案 1 :(得分:7)

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

 <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"/>

这对我有用。

答案 2 :(得分:4)

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

答案 3 :(得分:4)

我遇到了类似的错误,但使用的是代码中配置的连接,而不是配置文件。我的解决方案就是添加&#34;初始目录= MyDatabase&#34;部分。我的代码现在看起来像......

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

位置是mdb文件的完整路径,但不一定存在。

答案 4 :(得分:3)

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

我确信你可以在没有Management Studio的情况下使用控制台命令来做这些事情,但我对T-SQL并不是那么好,并且无法就此提供建议。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

检查您的web-config文件,可能有多个具有相同名称的连接字符串

答案 7 :(得分:0)

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

  1. VS搜索调试文件夹中的mdf文件
  2. 项目文件夹中有一个OrderByDescending文件,有时VS同步这两个文件 文件
  3. 由于某种原因,.mdf文件未同步到Debug
  4. 我的解决方法:

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

答案 8 :(得分:0)

在 .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 => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection").Replace("projectPath", projectPath)));

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

重要的是要知道,数据库 .mdf 文件本身将默认复制到每个构建版本的构建目标文件夹 ,或者如果配置为{{1 }}仅在文件版本已更改的情况下才使用文件资源管理器(建议使用Copy if newer来防止在每次构建时都覆盖数据库)。

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

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

|DataDirectory|

答案 11 :(得分:0)

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文件中的路径,便能够在DataGridView中的调试器的多次运行之间以及Visual Studio本身的多次运行之间具有数据持久性。希望这对某人有帮助!我在这根头发上拉了很多头发。

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

答案 12 :(得分:0)

只需使用新位置更改路径即可。

  

您将如何获得路径?

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

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

答案 13 :(得分:0)

尝试一下,它对我有用

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);
}

答案 14 :(得分:0)

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

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

工作正常。

答案 15 :(得分:0)

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

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

  

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

...or it is located on UNC share.

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

答案 16 :(得分:0)

到目前为止我发现了解决问题的方法,如果以下面的方式创建mdf文件,它对于visual studio来说效果会很好。

右键单击服务器中的数据连接Explorar-&gt; add connection-&gt;选择Microsoft SQL Server数据库文件并选择数据库名称并选择确定。然后这个概率不会出现。 关注视频: youtube link

答案 17 :(得分:0)

我在我的应用程序中尝试过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并在其上输入属性。将副本设置为输出目录。

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

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

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

答案 22 :(得分:0)

我更改了

后,错误已修复
ConfigurationManager.ConnectionStrings[0].ConnectionString

到这个

ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString

答案 23 :(得分:-1)

我有同样的问题,我想我想出来了。在连接字符串中确保连接字符串如下所示:

<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" />

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