使用|DataDirectory| 的烦恼

本文介绍了在ADO.NET 2.0中如何正确利用|DataDirectory| MagicValue进行数据库连接配置,特别针对WinForm应用程序。通过实例展示了在不同环境下(如Debug和Release)如何避免数据库文件被重复复制的问题,并提供了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  Ado.net2.0中新增加了一个MagicValue,可以在应用程序的配置文件的数据库链接串种使用|DataDirectory| ,例如

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

原来一直使用ASP.net开发web应用,asp.net 2.0特有几个特殊的文件夹App_Data就是其中一个,web应用的数据库大可以放在这个下面,一直工作的很好。......知道有一天开始写winform的程序,^_^,当然也想享受这种方便啦,可是发现Windows应用项目中不支持特殊的文件夹,根本没有这种东西!没关系咱自己建,还叫App_Data,运行发现数据库连不上,从错误信息中来看,原来Winform中把|DataDirectory|翻译成了程序启动目录apppath/bin/debug(或release),后面不带App_Data!数据库文件倒是自动复制倒了运行目录下(带着App_Data的目录)没关系,咱自己加上,把上面的链接串改成这样

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

一运行,哈哈,链接成功了。试着录入几个数据,保存,ok没问题!退出,再运行,一看傻眼了,刚才录入的数据不见了!研究半天明白了,原来每次运行,.net都自动复制了一份数据库到运行目录,所以上次的数据就都丢失了!想到两个解决办法,1,把数据库的属性中的“复制到输出目录”设置为“不复制”,这样Debug和Release编译版本各用各的数据库,原始的数据库始终是空的!(好像也有用)2,链接到程序目录中的App_Data下的数据库。由于对第一种解决办法,自我感觉有点儿迷惑和Webform中的经验不一致,所以决定用第二种,Google了一下,有位我不认识的老外^_^给出了解决办法http://blogs.msdn.com/dataaccess/archive/2005/10/28/486273.aspx,就是在程序启动时,设置AppDomain.CurrentDomain.setData(“DataDirectory”,我的目录字符串);Winform的程序那当然是在Main函数中了,废话不说了,我的代码如下

string  p  =  AppDomain.CurrentDomain.BaseDirectory;
            
if  (p.IndexOf( " //bin// " >   0 )
            
{
                
if (p.EndsWith("//bin//Debug//"))
                    p 
= p.Replace("//bin//Debug""");
                
if (p.EndsWith("//bin//Release//"))
                    p 
= p.Replace("//bin//Release""");
            }

            
if  ( ! p.EndsWith( " App_Data// " ))
                p 
=  p  +   " App_Data// " ;
            AppDomain.CurrentDomain.SetData(
" DataDirectory " , p);
思想就是去掉调试期间和生产期间的不同,这样要注意的是,发布程序的时候,数据库也要放到App_Data目录下面。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值