ADO.NET數據訪問技術
就是將C#和MSSQLl連接起來的紐帶
可以通過ADO.NET將內存中的臨時數據寫入到數據庫中,也可以將數據庫中的數據提取到內存中供程序調用。是所有數據訪問技術的基礎。
ADO.NET使用一些ADO對象,如Connection和Command對象,也引入了一些新對象。關鍵的新對象包括DataSet,DataReader,和DataAdapter。
Connections. 用於連接和管理針對數據庫的事務。
Commands. 用於發出針對數據庫的SQL指令。
DataReaders. 用於從SQL Server數據源讀取只進流的數據記錄。
DataSets. 用於針對結構型數據,XML數據和關系型數據的存儲,遠程處理和編程。
DataAdapters. 用於推送數據到DataSet,並針對數據庫協調數據。
Connections
Connections用於和數據庫“溝通”,並且被聲明為特定的提供程序級別,例如SQLConnection。Commands掃描連接然后結果集以流的形式被返回,這種流可以被DataReader對象讀取,或者推入DataSet對象。
下面的例子演示了如何創建一個連接對象。Connections可以通過調用Open方法被顯式打開
1 SqlConnection conn = new SqlConnection("server=.;database=Data0720;user=sa;pwd=123");
數據庫連接字符串
server=連接的數據庫;database=連接數據庫中國的那個表;user=用戶名;pwd=密碼
Commands
Commands包含提交到數據庫的信息,特定於提供程序的類比如SQLCommand。一個命令可以是一個存儲過程調用,一個UPDATE語句,或者一個返回結果的語句。你也可以使用輸入和輸出參數,返回值作為命令的一部分。下面的示例演示了如何對數據庫執行一條insert(無返回值)語句和update(有返回值)語句。
數據訪問類中的示例
1 // 創建 SqlConnection 與 SqlCommand 對象 在構造函數中獎他們實例化出來 2 SqlConnection conn = null; 3 SqlCommand cmd = null; 4 public UsresData() 5 { 6 conn = new SqlConnection("server=.;database=mydb;user=sa;pwd=123"); 7 cmd = conn.CreateCommand(); 8 } 9 public void insert(Users u)//添加方法 10 { 11 cmd.CommandText = "insert into Users values(@a,@b,@c,@d,@e,@f,@g)"; 12 cmd.Parameters.Clear(); 13 cmd.Parameters.Add("@a",u.UserName); 14 cmd.Parameters.Add("@b", u.PassWord); 15 cmd.Parameters.Add("@c", u.NickName); 16 cmd.Parameters.Add("@d", u.Sex); 17 cmd.Parameters.Add("@e",u.Birthday); 18 cmd.Parameters.Add("@f", u.Nation); 19 cmd.Parameters.Add("@g",u.Area); 20 conn.Open(); 21 cmd.ExecuteNonQuery(); 22 conn.Close(); 23 } 24 public bool update(Users u)//修改方法 25 { 26 bool ok = false; 27 cmd.CommandText = " update Users set PassWord=@a,NickName=@b,Sex=@c,Birthday=@d,Nation=@e,Area=@f;"; 28 cmd.Parameters.Clear(); 29 cmd.Parameters.Add("@a",u.PassWord); 30 cmd.Parameters.Add("@b", u.NickName); 31 cmd.Parameters.Add("@c", u.Sex); 32 cmd.Parameters.Add("@d", u.Birthday); 33 cmd.Parameters.Add("@e", u.NickName); 34 cmd.Parameters.Add("@f", u.Area); 35 conn.Open(); 36 try 37 { 38 cmd.ExecuteNonQuery(); 39 ok = true; 40 } 41 catch 42 { } 43 conn.Close(); 44 return ok; 45 }
DataReaders
DataReader對象有點類似一種只讀/只進的數據游標。DataReader API不但支持平級數據而且支持層級數據。數據庫執行一條命令后會返回一個DataReader對象。返回的DataReader對象格式不同於一個記錄集。比如,你可以在一個web頁面使用DataReader顯示搜索結果列表。
下面的示例 讀取數據庫中數據的方法
1 // 創建 SqlConnection 與 SqlCommand 對象 在構造函數中獎他們實例化出來 2 SqlConnection conn = null; 3 SqlCommand cmd = null; 4 public UsresData() 5 { 6 conn = new SqlConnection("server=.;database=mydb;user=sa;pwd=123"); 7 cmd = conn.CreateCommand(); 8 } 9 10 public Users select(string uname)//讀取一條數據 11 { 12 Users u = null; 13 cmd.CommandText = "select * from Users where UserName=@a;"; //拼TSQL語句 14 cmd.Parameters.Clear(); 15 cmd.Parameters.Add("@a",uname); 16 conn.Open(); 17 SqlDataReader dr = cmd.ExecuteReader(); 18 if (dr.HasRows)// 如果有數據 19 { 20 dr.Read();//讀取數據 21 u = new Users(); 22 u.UserName = dr["UserName"].ToString(); 23 u.PassWord = dr["PassWord"].ToString(); 24 u.NickName = dr["NickName"].ToString(); 25 u.Sex = Convert.ToBoolean(dr["Sex"]); 26 u.Birthday = Convert.ToDateTime(dr["Birthday"]); 27 u.Nation = dr["Nation"].ToString(); 28 u.Area = dr["Area"].ToString(); 29 } 30 conn.Close(); 31 return u; 32 } 33 34 public List<Users> select()//查全部 35 { 36 List < Users > list = new List<Users>(); 37 cmd.CommandText = "select * from Users"; 38 conn.Open(); 39 SqlDataReader dr = cmd.ExecuteReader(); 40 if (dr.HasRows) 41 { 42 while (dr.Read()) 43 { 44 Users u = new Users(); 45 u = new Users(); 46 u.UserName = dr["UserName"].ToString(); 47 u.PassWord = dr["PassWord"].ToString(); 48 u.NickName = dr["NickName"].ToString(); 49 u.Sex = Convert.ToBoolean(dr["Sex"]); 50 u.Birthday = Convert.ToDateTime(dr["Birthday"]); 51 u.Nation = dr["Nation"].ToString(); 52 u.Area = dr["Area"].ToString(); 53 list.Add(u); 54 } 55 } 56 conn.Close(); 57 return list; 58 }
DataSets
DataSet對象和ADO RecordSet對象相似,但更強大,並且有一個重要區別:DataSet總是斷開連接的。DataSet代表緩存數據,與數據庫結構類似例如表,列,關系,和約束。然而,盡管DataSet可以也確實表現的更像一個數據庫,最重要的請記住DataSet對象不直接和數據庫交互,或者其他數據源。這使得開發人員無論使用什么數據源都可以始終使用一種一致的編程模型。數據從數據庫,XML文件來,或者從用戶輸入來都可以放進DatSet對象。然后,當更改DataSet就可以被跟蹤和驗證之前更新數據源。DataSet對象的GetChanges方法實際上創建了第二個僅包含更改數據的DataSet。然后由DataAdapter(或其他對象)使用這個DataSet來更新原始數據源。
DataSet具備XML的特性,包括生產和消費XML數據和XML模式的能力。XML模式可以用來描述通過XML Web服務交換的模式。事實上,模式化DataSet實際上可以被編譯為類型安全和完整的語句。
DataAdapters (OLEDB/SQL)
DataAdapter對象作為DataSet和數據源之間的橋梁。當使用Microsoft SQL Server數據庫時,利用特定提供程序SqlDataAdapter(和他相關的SqlCommand和SqlConnection)可以提高整體的性能。對於其他支持OLE DB的數據庫,你可以使用OleDbDataAdapter和他先關的OleDbCommand和OleDbConnection對象。
DataAdapter對象使用命令在DataSet完成變動后更新數據源。使用DataAdapter的Fill方法調用SELECT命令;使用Update方法對於每個更改行調用INSERT、UPDATE或者DELETE命令。你可以顯示設置這些命令以便在運行時控制這些語句的使用解決變更,包括使用存儲過程。對於特別的場景,CommandBuilder對象可以在運行時基於select語句生成這些語句。然而,運行時創建語句需要在服務器做額外的往返以便手機必須的源數據,所以在設計階段顯示的提供INSERT、UPDATE、和DELETE命令會導致更好的運行時性能。
小結:
- ADO.NET是適合於.NET框架的改進版的ADO。
- ADO.NET是在多層架構、無狀態性與XML的情況下誕生的。DataSet和DataAdapter2個對象提供這些場景。
- ADO.NET可以被用於從流獲取數據,或者緩存用於更新的數據。