在项目中用程序中嵌入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://www.rupeng.com/forum/thread-11988-1-1.html

转:WinForm程序中两份mdf文件问题的解决方法相关推荐

  1. mac 您没有权限打开应用程序_Mac应用程序无法打开或文件损坏的解决方法

    很多用户在安装Mac软件的时候,经常会遇到提示"xxx.app已损坏,打不开.您应该将它移到废纸篓"或"打不开的xxx.app,因为它来自身份不明的开发者",如 ...

  2. 在C++中缺少一些文件时的解决方法

    在VS2017 c++中有些.h或者.c头文件时,需要下载相应的头文件与.c文件,在下载后需要将文件直接复制粘贴到以下安装文件夹下,个人按照安装目录来进行复制粘贴.

  3. Allegro/cadence中只有dra文件缺少psm解决方法

    使用dra文件生成psm文件的操作步骤 首先,打开那个缺少psm的dra文件 点击File->Create Symbol,再弹出的对话框中点击保存,即可在当前的工作目录下创建一个与.dra文件同 ...

  4. 在winform程序中启动wpf窗体

    有时候需要在winform程序中利用wpf的许多优良特性,如何在其中启动wpf窗体呢? 前提:MainWindow.xaml是从别的地方copy到这个项目的,值得注意的是,除了MainWindow.x ...

  5. 在Winform程序中设置管理员权限及为用户组添加写入权限

    在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身 ...

  6. (转)在Winform程序中设置管理员权限及为用户组添加写入权限

    本文转载自:http://www.cnblogs.com/wuhuacong/p/5645172.html 在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行 ...

  7. 在C# winform程序中调用WPF写的数学公式编辑器

    由于工作原因,需要在程序中加入数学公式编辑功能,因此在网上找了不少开源数学公式程序.经过比较,最终选择了Math-Editor-master程序(可以在github上搜索此名称). 我的程序(简称主程 ...

  8. C#中Winform程序中如何实现多维表头【不通过第三方报表程序】

    问题:C#中Winform程序中如何实现多维表头. 在网上搜了很多方法,大多数方法对于我这种新手,看的都不是很懂.最后在新浪博客看到了一篇比较易懂的文章:[DataGridView二维表头与合并单元格 ...

  9. 在WinForm程序中嵌入ASP.NET

    现在的流行趋势是桌面程序Web化,Web程序桌面化,呵呵.最终目标就是你中有我,我中有你.例如MSN Explorer就是一个很好的展示,让用户在使用的时候分不清什么时候是在本地什么时候是在网络.而这 ...

最新文章

  1. 用Python分析深圳程序员工资有多高?
  2. 为什么租号玩显示服务器忙,租号玩上号器怎么用,租号玩上号器使用教程
  3. k8s 关键字以及管理流程。
  4. JavaScript入门【JavaScript专题1】
  5. java制定年月日第几天_(JAVA)输入年月日,计算日期是今年的第几天?
  6. 【华为云技术分享】云图说|管理与部署域家族云图说重磅推出:一图在手,谁与争锋!
  7. 字节跳动高伟豪:端到端深度召回算法
  8. 推荐几个漂亮实用的JS菜单
  9. git:致命的:无法从远程存储库读取
  10. Win10之广告弹窗终结器:Process Explorer
  11. 《Linux/UNIX OpenLDAP实战指南》——1.2 OpenLDAP目录架构
  12. GreenPlum学习笔记:split_part与string_to_array字符截取
  13. 如何进行app消息推送(push)
  14. 比较好的java网站[推荐]
  15. C++操作Excel表格
  16. 读《南怀瑾讲人生哲理》
  17. .doc文件不显示word图标的解决方法
  18. 1.13.Mark1
  19. UI设计可供性解析:巧用隐藏的设计力提升用户体验
  20. 最近在读的一些文章-2019.04

热门文章

  1. 远程仓库都不知道,那你学Git干嘛?
  2. c语言迷宫算法设计,基于C语言的可连通迷宫算法设计及实现(毕业学术论文设计).doc...
  3. swift golang java,解决两数之和 (Javascript, Java, C#, Swift, Kotlin, Python,C++, Golang)
  4. git log 获取构建时间_Docker 运行 Jenkins 自动化构建 .NET Core 项目
  5. 新康众闫顺成:数据中台建设中的得与失
  6. 视频 + PPT 下载 | 挣脱流量束缚,社交电商的未来在哪里?
  7. 如何成为一名大数据工程师?
  8. 1.3:Render Pipeline and GPU Pipeline
  9. 干货!不得不知的UI界面中“行为召唤按钮”设计秘诀
  10. spring配置xml遇到的一些错误,最后修改的版本