c#开发之有关|DataDirectory|路径与项目中文件是否复制相关

1.    问题描述

最近在做一个Sql Server与Sql Server Compact Edition之间数据同步的Demo,已经大体上找到了思路。第一步通过创建[本地数据缓存]将Sql Server的框架和初始化数据同步到本地SDF文件中。默认的情况下程序会自动的在项目的根目录下(比如e:\program solutions\SyncDemo为程序根目录,默认是debug下编译,生成目录是\bin\debug)创建一个对应的TestDataBase.sdf文件。同时,细心观察项目中自动生成的app.config文件中connectionString的也是这样的路径(Data Source=|DataDirectory|\TestDataBase.sdf)。

但是在运行过程中,发现,数据库文件在重新编译生成后会拷贝一份到生成路径下,同时会伴随数据的丢失。

2.    问题思考及解决

上面遇到的问题,http://blog.csdn.net/heqichanggg/article/details/5784839这边文章中哥们也遇到了,按照前辈的指点,我明白了:每次程序在重新编译生成时,.net会默认自动的将数据库文件拷贝到运行目录。所以上次运行时操作的数据保存在运行目录下,经过重新的编译后被之前的数据库文件替换,造成数据丢失。我的解决方案也是将数据库文件属性设置为[不复制]。

同时,在我的项目Demo中,会遇到根据不同的规则创建很多的本地数据缓存.sync,但是他们同时使用相同的一个sdf文件。这样的话,|DataDirectory|的问题出现了。根据需求,我将sdf文件放到e:\program solutions\SyncDemo\Deploy文件下,同时项目的生成路径也在这里,文件属性设置不复制。

但是,项目中提示错误信息“数据库文件找不到路径”之类的,原来|DataDirectory|在默认编译时会将e:\program solutions\SyncDemo\Deploy认为是|DataDirectory|,根据配置文件中的路径则变到e:\programsolutions\SyncDemo\Deploy\Deploy\TestDataBase.sdf。因此找不到文件。解决方案http://blog.csdn.net/heqichanggg/article/details/5784839,http://www.cnblogs.com/jhxk/articles/2583680.html中都有答案。我的代码如下

    static class Program
    {
        /// <summary>
        /// 应用程序入口
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            SetDataDirectory();
            Application.Run(new Form1());
        }
        static void SetDataDirectory()
        {
            string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@"\Deploy\"))
            {
                dataDir = System.IO.Directory.GetParent(dataDir).Parent.FullName ;
                AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
            }
        }
    }

3.    问题总结

在项目中遇到问题,我觉得在网络上基本上都能找到答案,因为我还是一个初学者。对很多的事情不是很了解,比如说数据库文件的复制与否,在之前我是没有考虑过这会是一个问题的。

4.   有关相对路径

上面是讨论的|DataDirectory|的用法,它本身最好使用在本项目中;

但是有时候一个解决方案中会包括多个项目,但是最终会将各个项目的生成路径指到一个路径下,这样时候,还是会用到相对路径的问题。比如我的项目生成路径为..\..\Debug的目录,同时数据库也在这个目录下,那么我的app.config或者是settings.setting中直接修改为..\..\Debug\TestDataBase.sdf即可。

5.   项目的生成 补充

项目的生成路径,就是在项目编译后生成的文件存放的位置,在项目右键属性[生成]中可以找到。在团队开发中,比如我做的是远程数据库与本地库文件之间的同步,我将我的程序项目单独写在一个类库里面,这样子方便我的修改移植和调用,里面会产生App.config文件,App.config文件在编译后会根据项目生成产生一个[项目名].config的文件,里面保存了本项目的配置。我想说的是,在我的项目中有App.config,同一解决方案下其他的项目中也有可能会有App.config,这样我的项目在嵌入到整个项目后,启动整个项目时,还是那些配置吗?或者里面的配置还生效吗?其实,我的担心是多余的,因为在一个解决方案生成后只有一个启动项exe,我们的各自的项目的配置文件最好是在这个exe.config中体现出来,这样,将我们的项目中的配置迁移到整个项目的配置文件相应的节点中,这样,整个项目启动时,我们的项目也不需要修改配置和迁移,方便很多。这一点,之前没有注意到他的好处。


6.    参考文献

http://www.cnblogs.com/jhxk/articles/2583680.html

http://www.myexception.cn/c-sharp/1399684.html

http://my.oschina.net/deanzhao/blog/114550

http://blog.csdn.net/heqichanggg/article/details/5784839



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值