asp.net WinForm 兩份mdf檔案問題的解決

來源:互聯網
上載者:User

在項目中用程式中嵌入mdf檔案的方式來進行sqlserver資料庫教程開發非常方便,用來發布開源項目等很方便,點擊就可以運行,免部署,特別是在教學中用起來更加方便,老師不用先將資料庫檔案detach再發給學生,學生也不用將資料庫檔案attach。採用項目中嵌入mdf檔案的方式,老師把講課的代碼發給學生,學生開啟就可以運行。教學中就是用的這種方式進行講解。

在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(@"bindebug")
                || datadir.endswith(@"binrelease"))
            {
                datadir = system.io.directory.getparent(datadir).parent.parent.fullname;
                appdomain.currentdomain.setdata("datadirectory", datadir);
            }

原理簡單分析:連接字串中的datadirectory的值就是通過appdomain.currentdomain.setdata賦值過去的,如果當前程式的目錄以"bindebug"或者"binrelease"則認為它是運行在visualstudio環境中,就取項目的目錄然後賦值給datadirectory這個key。既然是currentdomain.setdata,估計對於非預設appdomain中的資料庫連接代碼可能會不起作用(只是猜測,沒驗證),這就要需要建立子appdomain的時候再去賦值了。

上面的代碼還是有一點潛在的bug的,比如正式的啟動並執行時候exe被很杯具的放到了某個bindebug目錄下,就會有問題,不過想想正式生產環境啟動並執行時候肯定不會用這種attachdbfilename方式,這種方式只存在於開發環境,因此也就睜一隻眼閉一隻眼了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.