ADO.NET
介紹
ADO.NET是是一個COM組件庫,用於在以往的Microsoft技術中訪問數據。也是就是說通過ADO.NET技術可以訪問數據庫中的數據。(所以對我們來說了解它是十分有必要的)
1.對象模型構成
ADO.NET由兩部分組成:數據提供程序(Provider)和數據集(DataSet)
- Provider:它能和數據庫保持鏈接,並且執行SQL命令,操作數據集
- DataSet:能在斷開數據庫的情況下操作數據(核心)
- Dataset是由多張DataTable(即我們通常所說的表)構成的
- Provider裏面有四個非常重要的對象,分別是:DataReader、DataAdapter、Commond、Connection。
2.ADO.NET 對象模型
*Connection
我們可以把數據庫看作水源,裏面存儲了大量的水(數據),Connection好比伸入水中的進水龍頭,保持了和水的接觸,只有它和水接觸了,其他的對象才能得到水。
*Command
Command 就像抽水機,爲抽水提供動力和執行方法,通過“水龍頭”,然後把水返回給“水管”。簡單地說,就是我們寫好了SQL語句,讓command對象去執行。
*DataAdapter
DataAdapter像輸水管,擔任着水的傳輸任務,並起着橋樑的作用,通過發動機把水從水源送到水庫(dataset)裏進行保存
*DataReader
DataReader也是一種水管,起着同樣的作用。但是,它不是把水輸送到水庫裏面,而是單向地直接把水送到需要用水的用戶那裏,所以要比在水庫中轉一下要更快一點。
*DataSet
DataSet爲”大水庫”,把抽上來的水在按一定的關係的池子裏進行存放,即使撤掉”抽水裝置”,也能保持水的存在(ADO.NET的核心)。也可以理解爲數據庫的表在內存中映射的緩存。
*DataTable
DataTable是水庫中,每個獨立的水池子,分別存放不同類別的水,他們一起組成了”水庫”。
3.Connection 連接關閉數據庫
*訪問數據庫需要用到數據庫連接類,在C#中可以通過Connect類來實現
*步驟
在網上下載相應的dll 驅動程序(類庫),放到本地文件夾的某個地方
在你的工程項目中,單擊”引用”添加引用添加之後,右邊就可以看到新增的引用類庫,其次就是引用命名空間,我這裏用的是MySQL,其他的數據庫也是類似的。
- 將連接方法聲明至字符串中
- 創建Connection對象
- 調用方法,打開數據庫連接
string conStr="Server=localhost;user=root;pwd=123456;database=XX";
MySqlConnection myCon=new MySqlConnection(conStr);
myCon.open();
*爲了節省系統資源,提高性能,最好使用完數據庫後就要關閉連接,下面介紹幾種關閉連接的方式
=> 可以通過using語句,確保對象在退出時立即被釋放,從而達到關閉數據庫的作用
using(myCon){
myCon.Open();
//使用完之後會自動關閉連接
}
=> 使用try…catch…finally
try{
myCon.Open();
..... //代碼
}
catch{
.... //異常處理
}
finally{
myCon.Close();
}
4.Command操作數據
常用屬性:
CommandText: 要下達到數據源的命令
CommandTimeOut: 出錯時等待時間
常用方法:
ExecuteNonQuery():不返回任何值,一般應用於insert,update,delete操作
下面進行一個插入操作,向clerk表插入一條記錄(必須先添加引用,這樣才能使用命名空間)
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //創建數據庫連接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
string InsertSql = "inser into clerk values(10088,'Lucy',21,'F','warehouse',sysdate())";
MySqlCommand myCom = new MySqlCommand(InsertSql, myCon);
myCom.ExecuteNonQuery(); //執行操作
Console.WriteLine("數據庫插入操作完成");
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
執行完之後就可以看到數據庫表中多了一條記錄o(∩_∩)o
ExecuteScalar() :返回一個值,一般用於只返回一個值的語句。如求數據統計的count語句,求最大數、求最小數等等。
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //創建數據庫連接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
string maxAge = "select max(age) from clerk";
MySqlCommand myCom = new MySqlCommand(maxAge, myCon);
int max=(int)myCom.ExecuteScalar(); //執行操作
Console.WriteLine("最大的年齡是:"+max);
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
結果如下:
5.DataReader讀取數據
*DataReader對象提供了用順序的、只讀的方式讀取Command對象獲得的數據結果集。正是因爲DataReader以順序的方式連續地讀取數據,所以它會以獨佔的方式打開數據庫連接
*由於DataReader指執行讀操作,並且每次只在內存緩衝區裏存儲結果集中的一條數據,所以使用它的效率比較高。若要查詢大量數據,同時不需隨機訪問和修改數據,它是優先選擇。
常用屬性:
FieldCount: 表示記錄中有多少字段
HasRows: 用於表示DataReader是否包含數據
IsClosed :表示DataReader是否關閉
常用方法:
Close(): 將DataReader對象關閉。
GetDataTypeName(): 獲取字段數據形態。
GetName(): 獲取指定字段的名稱。
GetOrdinal(): 獲取指定字段名稱在記錄中的順序
GetValue(): 獲取字段的值
GetValues(): 獲取字段的所有值
Read(): 讀取下一條數據
++訪問DataReader對象時,使用索引要比使用字段名稱訪問速度要快
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //創建數據庫連接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
Console.WriteLine("數據庫已經打開");
string Sql = "select * from clerk";
MySqlCommand sqlCom = new MySqlCommand(Sql, myCon);
//聲明
MySqlDataReader dr;
dr = sqlCom.ExecuteReader();
Console.WriteLine("字段個數有:" + dr.FieldCount);
for (int i = 0; i < dr.FieldCount; i++) {
Console.Write(dr.GetName(i) + "\t"); //輸出表的字段名
}
Console.WriteLine();
while (dr.Read()) {
for (int i = 0; i < dr.FieldCount; i++) {
Console.Write(dr.GetValue(i) +"\t");
}
Console.WriteLine();
}
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
6.DataSet
*Dataset對象由一組DataTable對象組成,這些對象與DataRelation對象相互關聯,DataTable對象又包含Rows和Columns。
7.DataAdapter
*DataAdapter對象是DataSet和數據源之間的橋樑,可以建立並初始化數據表(DataTable),對數據源執行sql命令,與DataSet對象結合提供DataSet對象存取數據,可視爲DataSet對象的核心操作。
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //創建數據庫連接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
string sql = "select * from clerk";
MySqlDataAdapter Adapter = new MySqlDataAdapter(sql,myCon); //兩個參數,一個是sql語句,一個是連接
DataSet myds = new DataSet(); //創建DataSet對象
// Console.WriteLine(myds.Tables[0]); //沒有填充之前DataSet裏面是沒有表的
Adapter.Fill(myds, "clerk"); //兩個參數,把表“clerk”向dataset裏填充
Console.WriteLine("填充成功");
Console.WriteLine(myds.Tables[0]);// 控制檯將會輸出第一張表
outValues(myds); //調用函數輸出表的內容
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
public static void outValues(DataSet ds)
{
foreach (DataTable dt in ds.Tables) {
Console.WriteLine("表名:" + dt.TableName);
//遍歷行
foreach (DataRow row in dt.Rows) {
//遍歷列
foreach (DataColumn col in dt.Columns) {
Console.Write(row[col] + "\t");
}
Console.WriteLine();
}
}
}
結果:
*DataAdapter可用於執行數據庫的命令操作,含有四個不同的操作命令:
(1)SelectCommand: 選取數據源中的數據
(2)InsertCommand: 用於向數據源插入一條數據
(3)UpdateCommand: 用於更新數據源中的數據
(4)DeleteCommand: 用於刪除數據源中的記錄
UpdateCommand 進行更新
static void Main(string[] args)
{
string conStr = "Server=localhost;user=root;pwd=123456;database=company"; //創建數據庫連接字符串
MySqlConnection myCon = new MySqlConnection(conStr);
try {
myCon.Open();
string sql = "select * from clerk";
string updateSql="update clerk set sex='F' where name='smith'";
MySqlDataAdapter Adapter = new MySqlDataAdapter(sql,myCon); //兩個參數,一個是sql語句,一個是連接
DataSet myds = new DataSet(); //創建DataSet對象
Adapter.UpdateCommand=new MySqlCommand(updateSql,myCon);
Adapter.Fill(myds,"clerk");
Console.WriteLine("更新之前的");
outValues(myds);
//更新dataset
DataRow row = myds.Tables[0].Rows[0];
row["sex"] = "F";
Adapter.Update(myds, "clerk");
Console.WriteLine("更新之後的");
outValues(myds);
Console.Read();
}
catch(Exception ex) {
Console.WriteLine(ex.Message.ToString());
Console.Read();
}
finally {
myCon.Close();
}
}
近期自己在[我要自學網](http://www.51zxw.net/study.asp?vip=9618490)
學習C#入門教程。在這裏對知識進行梳理,希望能幫到大家