关于数据库的分离、附加和应用程序中App_Data文件的关系------我的理解
今晚遇到了这样的一个问题:
“/GDonline”应用程序中的服务器错误。
尝试为文件 E:\项目\GDONLINE_NEW\9-20\GDONLINE\APP_DATA\GDONLINEDATA.MDF 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Data.SqlClient.SqlException: 尝试为文件 E:\项目\GDONLINE_NEW\9-20\GDONLINE\APP_DATA\GDONLINEDATA.MDF 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
然后就百度去查了很多资料。。。。。。得出以下理解:
1.数据库分离:从SQL管理器中删除对数据库文件的控制(连接),即SQL管理器中会删除数据库的文件名,但并不删除数据库的文件,数据库文件还是跟分离前的状态一样。
2.从数据库中直接删除数据库的话,会直接把数据库文件也删除了。
3.数据库附加:把数据库附加到SQL管理器中,即:使SQL管理器控制数据库文件。
4.关于数据库连接以及App_Data文件:在该文件中放入数据库。当连接字符串为:"server=.;database=webxtw;uid=sa;pwd=1234567890"这种类型的话表示直接连接到SQL管理器的数据库中,与App_Data文件中是否有数据库无关。当连接字符串为:“Data Source=.;AttachDbFilename='|DataDirectory|GDonlineData.mdf';Integrated Security=True; Max Pool Size=512" providerName="System.Data.SqlClient”,即表示使用App_Data文件中的数据库,此时要注意 ‘|DataDirectory|’,这个的意思是指示数据文件的相对地址。具体解释如下:
|DataDirectory|解决webconfig数据库连接的相对路径问题
webconfig中的数据库连接是不支持Server.MapPath的,一般我们只能写上数据库文件的物理路径,这给网站迁移带来很大的不方便。今天在网上找到了一个解决办法,与大家分享下。看以下代码:
<connectionStrings>
<add name="ConnStr_Access"
providerName="System.Data.OleDb"
connectionString=
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\cms.mdb;"
/>
</connectionStrings>
|DataDirectory|会被自动解析到App_Data
下面是MSDN的说明:
使用 DataDirectory 替代字符串
AttachDbFileName 已在 ADO.NET 2.0 中进行了扩展,引入了 |DataDirectory|(包含在管道符号中)替代字符串。DataDirectory 与 AttachDbFileName 结合使用可指示数据文件的相对路径,允许开发人员创建基于数据库源的相对路径(而无需指定完整路径)的连接字符串。
DataDirectory 点的物理位置取决于应用程序的类型。 在此示例中,要附加的 Northwind.mdf 文件位于应用程序的 \app_data 文件夹中。
Data Source=.\\SQLExpress;Integrated Security=true;
User Instance=true;
AttachDBFilename=|DataDirectory|\app_data\Northwind.mdf;
Initial Catalog=Northwind;
使用 DataDirectory 时,目录结构中的结果文件的路径不能高于替代字符串指向的目录。 例如,如果完全展开的 DataDirectory 为 C:\AppDirectory\app_data,则上面显示的示例连接字符串有效,因为它在 c:\AppDirectory 之下。