Thursday, November 29, 2007

使用VB.NET的TableAdapter

開始打工之後,作什麼事情有稍微謹慎一點,所以當要使用到什麼軟體時都會想到會不會有版權問題,網路上找的免費軟體又怕有安全問題,我想就只有自己寫的最好。因為公司這邊似乎沒有Access軟體,所以有需要編輯到資料庫時,就變的有點棘手,網路上有找到一款mdb viwer plus不過用起來不是那麼上手,再這樣的情況下,與其再花時間找下去,不如我直接寫一個小程式可以進行資料庫的新增、刪除以及更新。在學校寫程式總是抱著只要能寫出來就好,但經過這幾個月來職業場上的洗禮,讓我會考慮到執行效率、所用的資源等問題,所以在寫這支程式之前,我給自己"能用越少程式碼越好,多利用現有的資源,避免浪費太多資源"這樣的期許。程式大概的功能如下:

透過datagridview、textbox、button進行資料的新增、刪除、更新

一開始就面臨了最大的問題要怎麼把資料新增進去(我不想再寫新增連線 開啟連線 執行 關閉連線這種code,希望透過visual studio 2005自己產的的物件加以利用),好不容易找到TableAdapter這個物件,msdn上有稍微介紹這個物件,是vs2005才有的新功能,雖然msdn上寫了很多,但msdn的特色不就是非常難懂他想表達的東西,他說的跟我試的總是有一點出入。

當資料庫連線建立之後TableAdapter會自動產生出來,且會自動把select、insert、update、delete等SQL語法建立起來,如果當程式對於datatable裡面的資料進行變動時,再呼叫TableAdapter.insert()、TableAdapter.update()...便可將資料回存到資料庫。

tableadapter1

TableAdaptert產生之後,相對應的SQL語法也一併產生

但是,總是會發生一些無法預期的錯誤,google大神說這樣就可以更新資料庫,可是我的資料庫卻永遠都沒辦法更新。只要把畫面關掉,新增進去的值就消失了,當時我的程式碼是這樣的:

tab1Adapter.insert(XX,XX)'將資料insert到datatable中
tab1Adapter.updata(XXX.tb1)'再將datatable更新到資料庫中
(msdn寫說update可以把datatable作的任何改變回存到資料庫中,所以我又下了update)

可是這個方法總是失敗,後來在請教google大神,發現tableadapter會將資料更新到\bin\Debug的資料庫,而不是當初會新增到project的資料庫,從某個角度看來它是很貼心,因為這樣之後給user用的時候的時候就是那個資料庫。因為這樣網路上很多文章都反應資料庫沒有更新,或許是一直去看原本匯進去的那個資料庫,這應該算是vs2005的一點小bug,發現了這個沒有說的秘密之後,我嘗試把update拿掉,沒想到就可以運作了。推論上段錯誤的程式碼,可能是我作insert之後雖然有新增加一筆資料,可是又作update又把沒有新一筆資料的datatable回存回去,導致資料庫都沒有改變,所以程式一關,資料就不見了(真正的原因有時間應該還要再try看看)。後來就一路順暢的把程式完成,寫法歸納如下:

新增-> tab1Adapter.insert()
修改-> tab1Adapter.update()
刪除-> tab1Adapter.delete()

tableadapter2

程式完成畫面