c# 與 Access資料庫 dataset操作
下面以Access資料庫為例說明,用C#的DataSet類訪問資料庫的一些操作方法。
操作涉及的主要C#類有:
DataSet:對應資料庫表的一個集合,實際上是資料庫表在記憶體中的一個快取
DataTable:對應資料庫表,是資料庫錶行的集合
DataRow:對應資料庫錶行
OleDbConnection:建立資料庫連線
OleDbDataAdapter:由資料庫生成DataSet,並負責DataSet與資料庫的同步
OleDbCommandBuilder:生成更新資料庫所需的指令
DataSet、DataTable、DataRow用於資料在快取中的操作,這上面的操作只有更新到資料庫中,修改結果才會被永久儲存。OleDbConnection 是用OLEDB方法連線資料庫所必需的。OleDbDataAdapter和OleDbCommandBuilder用來生成DataSet,完成資料庫更新。與OleDbDataAdapter和OleDbCommandBuilder相對應,SqlDataAdapter和SqlCommandBuilder也可以完成用SQL語言為指令的資料庫更新。
假設在D:盤建立了Access資料庫,其路徑為d:\0DBAcs\account.mdb,資料庫中有一張名為kaizhi的資料庫表。表結構如下:
表名;Kaizhi | ||||
欄位 | Field Name | 型別 | 說明 | |
1 | 開支ID | kzID | 自動編號 | |
2 | 開支人 | Kzren | 文字 | 50字元 |
3 | 開支專案名 | kzname | 文字 | 50字元 |
4 | 日期 | riqi | 日期/時間 | 99-99-99;0掩碼 |
5 | 開支說明 | shuoming | 文字 | 225字元 |
6 | 總金額 | zonge | 單精度 | 小數點任意;這項開支的總花費 |
7 | 數量 | shuliang | 長整型 | |
8 | 單價 | Danjia | 單精度 | 小數點任意 |
表建好之後:(1)對錶中新增新資料(2)查詢表中的某個欄位。為了實現這兩項功能,以下幾個問題要考慮:
1準備工作
宣告必須的公共變數
建立與資料庫的連線,建立DataSet物件
2新增記錄
在DataSet物件上新增記錄
同步DataSet物件物件與資料庫中的資料,這一點很重要,很多人忘記了資料進行同步,結果往往是新增、修改的資料不能儲存到資料庫中。
3查詢資料庫表中某記錄的某欄位;
我們可以將上述功能用一個類DataOper實現,下面是程式設計的主要活動。
宣告要用的C#系統類
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
宣告DataOper類中的公共變數
private string DBlocation;
private OleDbConnection dbconn; //資料庫連線
private OleDbDataAdapter da;
建立與資料庫的連線,這裡採用了OLEDB方法:
dbconn = new OleDbConnection(@"provider=microsoft.jet.oledb.4.0; Data Source=d:\0DBAcs\account.mdb");
dbconn.Open();
建立DataSet物件
da = new OleDbDataAdapter(@"select * from kaizhi", dbconn); //引用資料庫連線dbconn並依據SQL語句"select * from kaizhi"建立OleDbDataAdapter物件da
DataSet ds = new DataSet(); //建立DataSet物件
da.Fill(ds); //用OleDbDataAdapter物件da填充、更新剛建立的DataSet物件
新增記錄並更新資料庫
OleDbCommandBuilder cb = new OleDbCommandBuilder(da); // 建立OleDbCommandBuilder物件cb用於更新OleDbDataAdapter物件da的Insert、Delete、Update指令
da.UpdateCommand = cb.GetUpdateCommand(); //更新OleDbDataAdapter物件da的指令
設計人員可以編寫自己的更新指令,也可以象上面所寫的那樣用系統預設的指令。但不管怎樣,上面的語句不能缺少,否則程式在執行中會丟擲異常System.InvalidOperationException,並提示:Update requires a valid InsertCommand when passed DataRow collection with new rows.
DataRow drx = ds.Tables[0].NewRow(); //建立一條新記錄行
drx["kzren"] = "kzren";
drx["kzname"]="kzname";
drx["riqi"]=2008-10-11;
drx["shuoming"]="shuoming";
drx["zonge"] = 12;
drx["shuliang"] = 3;
drx["danjia"] = 4;
ds.Tables[0].Rows.Add(drx); //在表中追加記錄
da.Update(ds); //更新資料庫
要查詢引用某記錄的某欄位,直接按如下的方法引用就可以了。
String kx=ds.Tables[0].Rows[0]["kzren"].ToString()