A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 忘忧草 中级黑马   /  2012-4-23 16:58  /  2937 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

string dataDir = AppDomain.CurrentDomain.BaseDirectory;//获取基目录
            if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\"))
            {
                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
            }

我想这段代码应该是把当前项目的路径赋值给DataDirectory
谁能比较详细的解释下这段所谓神奇代码?

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

5 个回复

倒序浏览
看这个:http://www.rupeng.com/forum/thread-11988-1-1.html,杨老师的详细讲解!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
WinForm程序中两份mdf文件问题的解决

在项目中用程序中嵌入mdf文件的方式来进行SQLServer数据库开发非常方便,用来发布开源项目等很方便,点击就可以运行,免部署,特别是在教学中用起来更加方便,老师不用先将数据库文件detach再发给学生,学生也不用将数据库文件attach。采用项目中嵌入mdf文件的方式,老师把讲课的代码发给学生,学生打开就可以运行。我在传智播客.net培训班教学中就是用的这种方式进行讲解。

在ASP.net程序中只要将mdf文件放到项目的App_Data文件夹即可,在连接字符串中使用
Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CallCenter.mdf;Integrated Security=True;User Instance=True
做连接字符串即可。

但是在WinForm程序中,如果在项目的App_Data文件夹中新建一个mdf文件,然后用
Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CallCenter.mdf;Integrated Security=True;User Instance=True
进行连接会提示找不到CallCenter.mdf。原来WinForm程序并不会去App_Data中找mdf文件。原来在ASP.net中DataDirectory的值是当前项目的App_Data路径,而WinForm中的DataDirectory值则是当前项目的路径,因此Winform中mdf文件不用放到App_Data中,放到项目根目录下就可以。

但是新问题随之又来了,在WinForm中用这种方式开发的时候有时候改了项目中mdf文件中的表中的数据或者表结构,运行的时候却发现运行时通过程序读取的数据或者表结构没有变,而有时调试时Insert插入的数据在这次调试的时候竟然没有了。经过研究发现,WinForm程序运行的时候连接的是bin/Debug下的mdf文件,而不是项目中的mdf文件,这是和ASP.net程序行为不同的地方。每次程序发生Build行为的时候,项目中的mdf就会覆盖bing/Debug下的mdf文件,也就是有两个mdf文件的存在,项目中的mdf相当于“源文件”。虽然可以通过修改文件的“BuildToOuput”属性来部分解决问题,但是仍然不是很完美。

有一个比较很直接的想法,就是让程序去连接项目中的mdf文件,而不是连接bin/Debug下那个。
经过查询资料找到了修改方法,在Program.cs文件Main函数最开始加入如下代码:
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@"\bin\Debug\")
                || dataDir.EndsWith(@"\bin\Release\"))
            {
                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
            }

原理简单分析:连接字符串中的DataDirectory的值就是通过AppDomain.CurrentDomain.SetData赋值过去的,如果当前程序的目录以"\bin\Debug\"或者"\bin\Release\"则认为它是运行在VisualStudio环境中,就取项目的目录然后赋值给DataDirectory这个key。既然是CurrentDomain.SetData,估计对于非默认AppDomain中的数据库连接代码可能会不起作用(只是猜测,没验证),这就要需要创建子AppDomain的时候再去赋值了。

给你复制过来{:soso_e113:}

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
做了注释你自己看看能看懂不:
string dataDir = AppDomain.CurrentDomain.BaseDirectory;//获取基目录
             if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\")) //如果基目录是以\bin\debug,或者bin\release这2个目录结尾的话
             {
                 dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;//那么得到当前及目录的上2级目录的全称
                 AppDomain.CurrentDomain.SetData("DataDirectory", dataDir); //以得到的新目录改变域属性

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
z4226797 发表于 2012-4-23 21:22
WinForm程序中两份mdf文件问题的解决

在项目中用程序中嵌入mdf文件的方式来进行SQLServer数据库开发非常方 ...

难怪我发现每次运行后bin/Debug下自动生成mdf文件。他这种方法按说是要遏制bin/Debug下自动生成的mdf文件啊,为什么我每次运行后还自动生成呢?
回复 使用道具 举报
忘忧草 发表于 2012-4-23 22:31
难怪我发现每次运行后bin/Debug下自动生成mdf文件。他这种方法按说是要遏制bin/Debug下自动生成的mdf文件 ...

不是遏制bin/Debug下自动生成的mdf文件,还是会在bin/Debug下生成mdf文件,里面不是这么解释的么:
WinForm程序运行的时候连接的是bin/Debug下的mdf文件,而不是项目中的mdf文件,这是和ASP.net程序行为不同的地方。每次程序发生Build行为的时候,项目中的mdf就会覆盖bing/Debug下的mdf文件,也就是有两个mdf文件的存在,项目中的mdf相当于“源文件”。

点评

原来是这个意思  发表于 2012-4-24 19:17
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马