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的时候再去赋值了。

上面的代码还是有一点潜在的bug的,比如正式的运行的时候exe被很杯具的放到了某个bin\Debug目录下,就会有问题,不过想想正式生产环境运行的时候肯定不会用这种AttachDbFilename方式,这种方式只存在于开发环境,因此也就睁一只眼闭一只眼了,呵呵。

参考资料:http://weblogs.asp.net/avnerk/archive/2005/12/25/433981.aspx
http://www.cnblogs.com/dajianshi/archive/2007/07/06/808495.html
### 回答1: 传智播客是一家著名的IT培训机构,成立于1998年,总部位于国北京市。他们专注于提供高质量的IT技能培训,培养人才并满足市场对IT人才的需求。 传智播客以其优质的师资力量和完善的教育体系而闻名。他们拥有一支由业内专家和经验丰富的讲师组成的教师团队,能够提供全面的知识和实践指导。此外,他们还与许多知名的IT企业合作,以保持他们的课程内容与行业发展的最新趋势保持同步。 传智播客的培训课程涵盖了多个领域,如计算机编程、网络技术、数据库管理和移动应用开发等。无论是初学者还是有经验的专业人士,都可以找到适合他们的课程。他们的培训内容从基础知识到高级技能的学习,全方位满足学员的需求。 传智播客的特色在于他们注重实践能力的培养。培训期间,学员们将参与实际项目的开发,通过动手实践解决实际问题,提升他们的技能和经验。此外,学员们还可以借助他们的校友和教师的支持,进行项目交流和合作。 总之,传智播客作为一家领先的IT培训机构,通过提供优质的教育和实践机会,已经培养了大量的优秀IT人才。他们的成功要归功于他们的专业师资、丰富的课程和实践导向的教学方法。无论是学习者还是企业,都可以从传智播客的培训受益,并且他们对IT行业的贡献会持续增长。 ### 回答2: 传智播客C是一家在编程教育领域具有知名度和影响力的教育机构。他们提供的培训课程以计算机编程为主,涵盖了包括软件开发、网站建设、移动应用开发等多个方向。通过他们的培训,学员可以学到实际的编程技能,并具备在相关领域就业的能力。 传智播客C作为教育机构的成功之处在于他们对教学的重视和创新。他们的教学方式注重实践,通过项目驱动的教学方式,让学员在真实的项目进行编程实践和解决问题,从而加深对知识的理解和掌握。此外,他们还注重培养学员的动手能力和团队合作能力,通过小组协作的项目实践,让学员学会与他人合作并有效地应用所学知识。 除了教学方式的创新,传智播客C还具备其他优势。首先,他们拥有一支优秀的师资队伍,这些讲师都是业界的专业人士,能够将最新的技术和实践经验传授给学员。其次,他们与众多知名IT企业建立了合作关系,学员有机会参与实习和就业推荐。此外,他们还提供灵活的学习方式,包括线下课程和线上课程,满足不同学员的需求。 总的来说,传智播客C在编程教育领域具有很高的声誉和影响力。他们通过创新的教学方式和专业的师资队伍,为学员提供了一个良好的学习环境和就业机会。无论是想要入门编程还是提升技能,传智播客C都是一个值得考虑的教育机构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值