ADO.NET

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#入門教程。在這裏對知識進行梳理,希望能幫到大家

發佈了40 篇原創文章 · 獲贊 87 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章