转:WinForm程序中两份mdf文件问题的解决方法
?????? 在項(xiàng)目中用程序中嵌入mdf文件的方式來進(jìn)行SQLServer數(shù)據(jù)庫開發(fā)非常方便,用來發(fā)布開源項(xiàng)目等很方便,點(diǎn)擊就可以運(yùn)行,免部署,特別是在教學(xué)中用起來更加方便,老師不用先將數(shù)據(jù)庫文件detach再發(fā)給學(xué)生,學(xué)生也不用將數(shù)據(jù)庫文件attach。采用項(xiàng)目中嵌入mdf文件的方式,老師把講課的代碼發(fā)給學(xué)生,學(xué)生打開就可以運(yùn)行。我在傳智播客.net培訓(xùn)班教學(xué)中就是用的這種方式進(jìn)行講解。
在ASP.net程序中只要將mdf文件放到項(xiàng)目的App_Data文件夾即可,在連接字符串中使用
做連接字符串即可。
但是在WinForm程序中,如果在項(xiàng)目的App_Data文件夾中新建一個(gè)mdf文件,然后用
進(jìn)行連接會(huì)提示找不到CallCenter.mdf。原來WinForm程序并不會(huì)去App_Data中找mdf文件。原來在ASP.net中DataDirectory的值是當(dāng)前項(xiàng)目的App_Data路徑,而WinForm中的DataDirectory值則是當(dāng)前項(xiàng)目的路徑,因此Winform中mdf文件不用放到App_Data中,放到項(xiàng)目根目錄下就可以。
但是新問題隨之又來了,在WinForm中用這種方式開發(fā)的時(shí)候有時(shí)候改了項(xiàng)目中mdf文件中的表中的數(shù)據(jù)或者表結(jié)構(gòu),運(yùn)行的時(shí)候卻發(fā)現(xiàn)運(yùn)行時(shí)通過程序讀取的數(shù)據(jù)或者表結(jié)構(gòu)沒有變,而有時(shí)調(diào)試時(shí)Insert插入的數(shù)據(jù)在這次調(diào)試的時(shí)候竟然沒有了。經(jīng)過研究發(fā)現(xiàn),WinForm程序運(yùn)行的時(shí)候連接的是bin/Debug下的mdf文件,而不是項(xiàng)目中的mdf文件,這是和ASP.net程序行為不同的地方。每次程序發(fā)生Build行為的時(shí)候,項(xiàng)目中的mdf就會(huì)覆蓋bing/Debug下的mdf文件,也就是有兩個(gè)mdf文件的存在,項(xiàng)目中的mdf相當(dāng)于“源文件”。雖然可以通過修改文件的“BuildToOuput”屬性來部分解決問題,但是仍然不是很完美。
有一個(gè)比較很直接的想法,就是讓程序去連接項(xiàng)目中的mdf文件,而不是連接bin/Debug下那個(gè)。
經(jīng)過查詢資料找到了修改方法,在Program.cs文件Main函數(shù)最開始加入如下代碼:
原理簡單分析:連接字符串中的DataDirectory的值就是通過AppDomain.CurrentDomain.SetData賦值過去的,如果當(dāng)前程序的目錄以"\bin\Debug\"或者"\bin\Release\"則認(rèn)為它是運(yùn)行在VisualStudio環(huán)境中,就取項(xiàng)目的目錄然后賦值給DataDirectory這個(gè)key。既然是CurrentDomain.SetData,估計(jì)對于非默認(rèn)AppDomain中的數(shù)據(jù)庫連接代碼可能會(huì)不起作用(只是猜測,沒驗(yàn)證),這就要需要?jiǎng)?chuàng)建子AppDomain的時(shí)候再去賦值了。
上面的代碼還是有一點(diǎn)潛在的bug的,比如正式的運(yùn)行的時(shí)候exe被很杯具的放到了某個(gè)bin\Debug目錄下,就會(huì)有問題,不過想想正式生產(chǎn)環(huán)境運(yùn)行的時(shí)候肯定不會(huì)用這種AttachDbFilename方式,這種方式只存在于開發(fā)環(huán)境,因此也就睜一只眼閉一只眼了,呵呵。
文章來源:http://www.rupeng.com/forum/thread-11988-1-1.html
總結(jié)
以上是生活随笔為你收集整理的转:WinForm程序中两份mdf文件问题的解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: exchange online 连接筛选
- 下一篇: Openstack DashBoard: