尝试将一个自动命名的数据库文件....database1.mdf附加到数据库时失败了。

35
我在调试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
我急切地等待着解决方案。
24个回答

37

我也遇到过这个问题,非常让人头疼。我配置了连接字符串并成功解决了这个问题。在连接字符串中,我将值为|DataDirectory|\dbfilename.mdf的属性 AttachDbFilename 替换为文件的路径。只有当数据库文件在同一项目中的 App_Data 文件夹内时才能使用 |DataDirectory|。

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

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

希望对你有用。


11
有没有办法使它相对一些? - Tauseef

11
尝试按以下方式创建您的连接字符串:

尝试按以下方式创建您的连接字符串:

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

它对我有效。


1
这解决了我的问题。使用Initial Catalog而不是AttachDBFilename。 - vgwizardx

5

<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文件的完整路径,该文件不一定存在。


3
在.Net开发Web应用程序时,最让人恼火的错误之一。我在一年前做的一个项目中遇到了这个问题。 以下是我的解决方法:我使用sa帐户登录SQL管理工具,并将数据库附加到对象资源管理器(数据库 -> 右键单击 -> 附加)。 然后,我打开了安全性 -> 登录 -> [我的Windows用户名] 并编辑了用户映射选项卡,为附加的数据库授予了 dbowner 权限。 我相信您可以使用控制台命令完成这些操作,但我对T-SQL不是很熟悉,无法给出建议。

2

我的项目是EF的Code-First,当文件被删除时会出现此问题。在包管理器控制台中运行Update-Database可以重新生成数据库并解决问题。


2
错误是由于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"

1
请检查连接字符串中数据库的路径。我遇到了同样的错误信息,后来发现问题是路径拼写错误导致的。

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

我们可以进入聊天吗?我觉得这对我来说是个问题! - rahulserver

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接