要理解MySQL,SQLServer,ACCESS都是數據庫的品牌,不同品牌的數據庫在不同的領域,適用場合有所不同。ACCESS應該是最簡單,至少是Windows上最容易上手的數據庫,MySQL可能跟PHP搭配在做網站的時候用的比較多,SQLServer跟ASP.NET搭配做服務器。由於ACCESS有很多版本,我們為了兼容之前的版本,盡量使用ACCESS2003的數據庫(MDB格式,往后的版本可能是ACCDB的格式),比如我安裝的是ACCESS2010,首先在選項中修改默認的空白數據庫格式為2003的
ACCESS2010下載(Office2010自帶了) :鏈接:http://pan.baidu.com/s/1o7Tjp3O 密碼:6wxi
然后文件-新建-空數據庫,默認是表1,並且里面是空的
右擊表1,切換到設計視圖,然后修改字段名稱,數據類型和備注(第一個ID前面有一把鑰匙,這個是數據庫的主鍵,就是說數據庫的每一條記錄為了唯一區分開來,都需要一個唯一的ID,如同每個人都可以有相同的名字,性別,但是要有唯一的身份證號碼區分開來,否則雙胞胎就沒法區分了。也可以取消ID的主鍵,自己設置其他屬性為主鍵,甚至某些特殊的數據庫不需要主鍵,但是這里先不做探討)
每一個字段對應的數據類型也可以很復雜,但是初學者也暫時不考慮節省存儲空間,編碼格式,溢出等問題,都按照默認即可
雙擊表1,然后隨便輸入幾條測試信息(注意在前面我們已經定義了ProductCount是數字,如果輸入非法數值會提示)
創建最簡單的讀取數據庫程序(只需要注意數據庫的實際位置,要選擇的表名稱)
最簡單的顯示數據庫的方法是放到一個DataGridView里面,點擊button1確實把數據庫的東西都弄出來了
為了更加簡化操作,也可以點開服務器資源管理器,然后數據連接,添加連接,選擇數據源,繼續,只要選中數據庫的文件路徑即可(測試連接確認通過)
然后右擊這個數據庫,屬性,復制連接字符串就可以了(作為代碼部分的連接使用)
如果要用C#連接帶密碼的數據庫,則需要在額外添加一行(這個微軟沒有做好,你跟上面一樣復制字符串沒什么用)
注意在執行任何SQL命令之前首先要關閉數據庫(ACCESS軟件也關了),初學者還是需要把命令放在try catch語句里面,方便知道自己哪里有問題
首先把數據庫的連接對象做成全局的,只在Form加載的時候執行一次(下面一節我們會把這些封裝成類庫,做的更加標准,為了測試方便暫時先不管)
僅僅連接是不夠的,數據庫一共有四項操作:增/查/刪/改,先來看查詢語句,因為我們在前面定義數據庫的時候,就自己定義了字段,所以查詢的時候可以按ID,產品名稱,產品數量等等查詢,注意查詢的內容如果是數字不需要加單引號,如果不是就要加(可以仔細分析下面兩句話),這個Select XXX from XXX where XXX=XXX是SQL的標准語法(不管你用什么品牌的數據庫,用什么語言編程,這個語句都是標准的,在真實的SQL語句中不可能這么簡單一句話,比如你淘寶搜東西,會按價格排序,再價格排序的基礎上找到信用最好的,再在信用最好的里面優先顯示曾經買過的或者黃鑽買家經常買的,所以多層的SQL語句的嵌套,模糊查詢,讓SQL語句更加精簡高效等等也是一門很深的學問,在這里我不做探討)
Select * from 表1 where ID=2
Select * from 表1 where ProductName='蘋果'
我們暫時只需要掌握如何把查詢結果正確的顯示出來(還是跟數據庫定義字段的時候一致),以及如果查不到結果,還有SQL語句組織錯誤的時候給與顯示,為了更加有條理的跟數據庫對應字段匹配,可能我們更應該把變量做到一個結構體里。
再來看新增指令,ACCESS數據庫不需要我們新增主鍵的ID,他會自動增加並且保證不重復,每次插入一條記錄的時候,只需要其他字段對應就可以(可以打開ACCESS數據庫刷新看效果,不要切換到設計視圖就可以)
INSERT INTO 表1(ProductName,ProductCount,ProductSource,ProductPlace) VALUES ('XXX','123','XXX','XXX');
讀者可以測試一下插入一條新的數據的時候,故意給非法值的情況,比如產品數量是數字類型,給一個ABC(try catch會給出提示,但是實際上如果做得比較嚴謹,還是不應該到執行SQL失敗了以后才報錯,因為try catch會浪費大量資源,我們應該在插入之前就把每一個字段是否有問題檢查好,不行就根本不應該打開數據庫,執行這條命令)
再來看刪除,如果根據ID刪除一定是一條記錄,如果根據其他屬性,可能刪除的有多條記錄(同樣數據庫會有顯示,刷新之后就沒了)
delete * from 表1 where ID=29
delete * from 表1 where ProductName='XXX'
最后看更新記錄,其實跟前面的語句也非常相似了(這里為了方便起見還是以ID為依據進行修改,其實很多時候比如物料倉庫系統,我們總是先根據物料編號或者物料名稱查詢得到一個結果,這個結果可能包含了不止一條記錄都列出來,然后在眾多記錄中找到我們要的記錄,點擊更新之后再定位到顯示出來的那條記錄的ID去,ID是不需要顯示的,但是ID卻始終是增查刪改的依據)
UPDATE 表1 SET ProductName='YYY',ProductCount='111',ProductSource='ZZZ',ProductPlace='WWW' where id=34
最后我們再回過頭來看一下如何從DataGridView直接跟ACCESS數據庫對接,需要注意的是實際上真的直接這樣做的並不多見,因為大部分涉及到數據的應用都會有幾百萬條以上的數據,你不可能直接把所有東西都顯示到一個WinForm的控件上,也不可能WinForm更新了一筆數據,就要把整個數據庫折騰一次。更何況從控件到內容,數據庫的輸入不允許非法字符(引號之類的),這些問題的專業處理都是要考慮的,我們用ACCESS小型數據庫搭建一個測試環境,純粹學習的角度沒有問題。
在讀取ACCESS數據庫中,我列舉了兩種方法,簡單的幾行搞定,復雜的沒有使用微軟提供的OleDbDataAdapter類,但是兩者都是要把ACCESS數據庫的內容謄寫到DT表上,然后設置數據源就完了
還有刪除記錄和更新記錄,也都可以用比較傻瓜的方法實現(刪除的時候先刪除控件的,再從DataTable更新SDA),刪除的本質在這里還是更新
直接綁定數據的問題:輸入非法值的報錯
直接綁定數據的問題:主鍵也可以被修改,但是沒有更新到真實的數據庫(理論上不應該允許編輯ID這一列,而且即便不允許編輯,仍然無法保證自動生成的序號數據庫一定不存在,這里我改成一樣之后點更新不會報錯,但是實際也不會執行,就不受控制了,可以點遍歷數據庫再恢復默認)
還有一些別的問題可以研究,比如在控件上直接添加數據庫的綁定(點開控件的小三角,然后添加項目數據源,點擊下一步)
選擇一個數據庫,然后新建連接,點擊下一步,綁定到已有的數據庫(這樣這個數據庫會復制到項目文件夾下,而且初始化的時候會自動更新到控件dataGridView,但是傻瓜也有傻瓜的缺點,他會自動生成一些代碼和控件,你的整個程序更加不受控了,而且這種綁定之后也不能完全實現ACCESS到DataGridView的完美鏈接,要想做的好必須自己封裝類庫,讓功能符合自己的需求,下一節我們會嘗試做數據庫讀寫類的封裝)
更多教學視頻和資料下載,歡迎關注以下信息:
我的優酷空間:
http://i.youku.com/acetaohai123
我的在線論壇:
http://csrobot.gz01.bdysite.com/
問題交流:
QQ:910358960