目錄:
- 簡單的介紹下ADO.NET
- SqlConnection(連接對象)
- SqlCommand(命令對象)
- SqlParameter(Sql參數)
- SqlDataReader(數據流讀取器)
- SqlTransaction(事務)
- SqlDataAdapter(數據適配器)
- DataSet,DataTable,DataRow,DataColumn
- 封裝數據庫操作類(這才是精華)
一丶簡單的介紹下ADO.NET
了解System.Data命名空間下我們常用的一些類:
1 ①System.Data → DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint,DataColumnMapping,DataTableMapping 2 ②System.Data.Coummon → 各種數據訪問類的基類和接口 3 ③System.Data.SqlClient → 對Sql Server進行操作的數據訪問類 4 主要有: a) SqlConnection → 數據庫連接器 5 b) SqlCommand → 數據庫命名對象 6 c) SqlCommandBuilder → 生存SQL命令 7 d) SqlDataReader → 數據讀取器 8 e) SqlDataAdapter → 數據適配器,填充DataSet 9 f) SqlParameter → 為存儲過程定義參數 10 g) SqlTransaction → 數據庫事物
二丶SqlConnection(連接對象)
1.連接字符串
基本語法:數據源(Data Source)+數據庫名稱(Initial Catalog)+用戶名(User ID)+密碼(Password)(這種方式比較安全)!
推薦文章 :SQL Server 連接字符串和身份驗證,你必須知道的ADO.NET(三) 連接字符串,你小覷了嗎?,SQL Server 2008連接字符串寫法大全,連接字符串有很多的寫法,最保險的寫法可以借助“SqlConnectionStringBuilder”類,它提供了全面的連接字符串的屬性,以至於減少出錯率(相關屬性查MSDN),還有大多數連接字符串都寫在配置文件里面了!
2.創建連接對象

1 SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder() 2 { 3 DataSource = "", 4 InitialCatalog = "", 5 UserID = "", 6 Password = "" 7 }; 8 SqlConnection connection = new SqlConnection(connectionStringBuilder.ToString());
3.打開和關閉連接對象(使用Using來關閉連接)

1 using(SqlConnection connection = new SqlConnection(connectionStringBuilder.ToString())) 2 { 3 connection.Open(); 4 connection.Close(); 5 }
關於連接池的文章:你必須知道的ADO.NET(五) 細說數據庫連接池(寫的還真不賴啊),頂...
三丶SqlCommand(命令對象)
1.實例化的時候默認初始化的四個屬性
2.創建命令對象
使用連接對象的“CreateCommand()”方法創建命令對象,也可以使用new來實例化對象!
1 SqlCommand command = connection.CreateCommand(); //這種方式比較好,也可以自己實例化一個對象!
3.幾個重要屬性
①CommandText:獲取或設置要對數據源執行的 Transact-SQL 語句、表名或存儲過程!
②CommandType:設置你執行的SQL語句是存儲過程還是T-SQL(是一個枚舉)!
③Parameters:設置你T-SQL中你需要用到的參數(后面會講到),是一個“SqlParametersCollection”類型,這個屬性很重要,是你通過代碼給SQL語句傳遞參數的途徑,所以記住語法,記住一些使用規則講對編碼有很大的幫助!
4.幾個重要的方法(相信大家熟悉的不能再熟悉了)
①ExecuteNonQuery:返回是影響的行數(int),主要執行更新,添加,刪除等操作!
②ExecuteReader:執行SQL或存儲過程,返回的是SqlDataReader類型,主要用來查詢!
★ 這邊注意這個方法的重載 CommandBehaviour 枚舉,成員如下:
1 command.ExecuteReader(CommandBehavior.CloseConnection); //在執行讀取之后會自動關閉連接對象
③ExecuteScalar:返回執行結果集中的第一行第一列,如果沒有數據,則返回NULL!
Note:因為可能會返回“Null”值,所以需要對結果進行判斷,如下:

1 object my = cmd.ExecuteScalar(); 2 if (object.Equals(my,null)) //可以使用Equals進行Null值的判斷,易讀性強 3 Console.WriteLine("Not Data"); 4 else 5 Console.WriteLine("Yes");
④CreateParameter:創建SqlParameter實例
1 SqlParameter para = cmd.CreateParameter() //此方法適合SQL語句中只有一個參數的情況!
推薦文章:你必須知道的ADO.NET(六) 談談Command對象與數據檢索
你必須知道的ADO.NET(七) Wow!Command對象高級應用
四丶SqlParameter(Sql參數)
1.幾個重要的屬性
ParameterName: 設置參數名
Value: 給參數設置值
Size: 設置參數字節最大大小(以字節為但為)
SqlDbType: 參數在SQL中的類型

1 SqlParameter paras = new SqlParameter() 2 { 3 ParameterName = "@name", 4 Value = 10, 5 SqlDbType = SqlDbType.Int, 6 Size = 4 7 };
2.命令對象添加參數集合的幾種方法
①AddWithValue
②Add
③AddRange
推薦文章:SqlParameter的作用與用法,代碼如下:
1 using (SqlConnection connection = new SqlConnection("")) 2 { 3 SqlCommand command = connection.CreateCommand(); 4 command.CommandText = ""; 5 6 //可以使用這種方式添加多個參數,不過方式不夠好 7 command.Parameters.Add("@name", SqlDbType.NVarChar).Value = "yang"; //第一種方式 8 command.Parameters.Add("@age", SqlDbType.Int).Value = 888; 9 command.Parameters.Add("@address", SqlDbType.NVarChar, 100).Value = "Jiang Su"; 10 11 //這種方式直接給定參數名和參數就可以了,可操作性比較差 12 command.Parameters.AddWithValue("@name", "yang"); 13 command.Parameters.AddWithValue("@age", 888).SqlDbType = SqlDbType.Int; 14 command.Parameters.AddWithValue("@address", "Jiang su").SqlDbType = SqlDbType.NVarChar; 15 16 //直接使用參數集合添加你需要的參數,推薦這種寫法 17 SqlParameter[] parameters = new SqlParameter[] 18 { 19 new SqlParameter("@name",SqlDbType.NVarChar,100){Value = "yang"}, 20 new SqlParameter("@age",SqlDbType.Int,2){Value = 888}, 21 new SqlParameter("@address",SqlDbType.NVarChar,20){Value = "Jiang Su"}, 22 }; 23 command.Parameters.AddRange(parameters); //參數也可以是一個Array數組,如果采用數組參數代碼的可讀性和擴展性就不是那么好了 24 25 //當我們把參數都添加好之后,會生成一個“SqlParameterCollection”集合類型,相當於參數的集合 26 //那么我們就可以對這些參數進行修改和移除了 27 //說穿了“SqlParameterCollection”內部其實是一個List<SqlParameter>的集合,只是它里面的復雜度比較高,考慮的很全面 28 command.Parameters[0].Value = "hot girl"; 29 command.Parameters[0].Size = 200; 30 }
3.說說“SqlParameterCollection”,參數集合
上面添加的“SqlParameter”參數都被添加到了“SqlParameterCollection”集合中去了,所以我們才能夠對它進行讀取和修改!
4.定義適當的參數屬性獲取存儲過程的返回值(return) → Direction = ParameterDirection.Output
代碼如下:

1 using (SqlConnection conn = new SqlConnection("")) 2 { 3 conn.Open(); 4 SqlCommand cmd = conn.CreateCommand(); 5 cmd.CommandText = "myProc"; 6 cmd.CommandType = CommandType.StoredProcedure; 7 SqlParameter[] paras = new[] //定義參數數組 8 { 9 new SqlParameter("@Description",SqlDbType.NVarChar,50,"RegionDescription"), 10 new SqlParameter("@RegionID",SqlDbType.Int,0,ParameterDirection.Output,false,0,0,"RegionID",DataRowVersion.Default,null) //定義此參數是Output參數 11 }; 12 cmd.Parameters.AddRange(paras); 13 cmd.UpdatedRowSource = UpdateRowSource.OutputParameters; //這句話可以不要 14 //給參數賦值 15 cmd.Parameters["@Description"].Value = "Yang"; 16 cmd.ExecuteNonQuery(); 17 //獲取返回值 18 int myRegionID = (int)cmd.Parameters["@RegionID"].Value; 19 Console.WriteLine("這是返回值:{0}", myRegionID.ToString()); 20 }
五丶SqlDataReader(數據流讀取器)
說實話,如果單單知道怎么使用讀取器,那是非常好學的,如果深入了解,它里面的知識將會非常的吸引人,那么就以我小菜的經驗來說說把,各位不要見怪啊!
1.基本用法

1 using (SqlConnection conn = new SqlConnection("")) 2 { 3 conn.Open(); 4 SqlCommand command = conn.CreateCommand(); 5 command.CommandText = ""; 6 using (SqlDataReader dr = command.ExecuteReader(CommandBehavior.CloseConnection)) 7 { 8 while (dr.Read()) 9 { 10 //開始讀取數據了,接下來你想怎么樣就怎么樣了 11 string str = dr.GetSqlString(0).ToString(); 12 } 13 } 14 }
2.常用方法
①GetOrdinal:獲取指定列名的列序號(索引號),使用這個方法可以把經常變動的列進行固定
1 int name = dr.GetOrdinal("name"); //通過列名來獲取當前列的索引號,這樣如果下次你列名順序發生變化也沒有關系
②GetName: 獲取列名,參數為指定列名的序列號,返回string
1 string columnName = dr.GetName(name); //通過列名所處的索引號來獲取列名名稱
③IsDBNull:判斷當前讀取的數據是否為Null,返回類型為Bool
1 dr.IsDBNull(coContactID) ? "NULL" : dr.GetInt32(coContactID).ToString() //相信大家都會使用的
④NextResult:當查詢為批處理查詢時,使用這個方法去讀取下一個結果集,返回值為Bool,如果存在多個結果集,則為 true;否則為 false
1 //select * from Employee;select * from County,這樣的話就可以采用這種方式 2 dr.NextResult(); //記住這個要放在while(dr.Read())之后,因為讀取一個數據集之后才能讀取下一個數據集
⑤Read:讀取數據
讀取數據最重要的方法,不說了!
3.常用屬性
①HasRow:判斷是否包含一行或多行,也就是判斷有沒有數據,返回類型為Bool
②FieldCount:獲取讀取的列數,返回類型為Int
③IsClosed:判斷讀取的數據流是否關閉
所以靈活運用上面的屬性講增強代碼的可讀性和健壯性,綜合示例:

Note:當 SqlDataReader 關閉后,只能調用 IsClosed 和 RecordsAffected 屬性,如果調用其它方法或屬性將會報錯!
4.性能深入剖析
讀取數據的時候會有很多種寫法,如dr[0].ToString(),dr["Name"].ToString(),dr.GetString(0),dr.GetSqlString(0)等等的讀取方式的寫法,如果大家去網上查資料就會很容易發現這幾種寫法存在着一些差異!
下面是讀取數據性能的總結:
1 SqlDataReader讀取方法: 2 1. DataReader 索引 + 基於 [序列號] → dr[0].ToString | Index-based access 3 2. DataReader 索引 + 基於 [列名] → dr["Name"].ToString | 性能最差 4 3. Get 開頭的 + 基於 [序列號] → dr.GetString(0) | type-access 5 4. GetSql 開頭的 + 基於 [序列號] → dr.GetSqlString(0) | Provider-specific typed accessor 6 5. GetOrdinal() 通過列名獲取這個列的序列號 | 這個方法在提高性能上面有作用 7 6. 性能(4) --> (3) --> (1) --> (2)
Note:所以在對數據進行讀取時要有針對的使用一些性能高的方法,也不是說要追求性能,只是這是一種習慣,對於大多數讀取數據庫的方法使用索引來讀取無疑是最快,記住一句話,“當性能沒有成為問題的時候,不要過度的去優化它”,高效而又優美的使用這些方法,才是王道!
PS:我這里的總結其實是以前在園子看到一個人寫的,找了半個小時都沒找到,如果有人看到過,發個鏈接給我,我補上!
5.SqlDataReader和DataSet的討論
推薦文章:談談Asp.net網站優化一:SqlDataReader和DataSet的選擇
六丶SqlTransaction(事務)
1.代碼中的事務
現在代碼中基本使用存儲過程來控制事務的處理,通過代碼進行控制事務也是我們學習ADO.NET的任務之一!
事務是在連接對象之后創建,並把它跟命令對象進行關聯,使用try.....Catch捕獲異常,然后調用RollBack方法回滾事務!
Commit:提交
RollBack:回滾

1 /// <summary> 2 3 /// 使用事務 4 5 /// </summary> 6 7 public void TransactionConn() 8 9 { 10 11 try 12 13 { 14 15 SqlConnectionStringBuilder connBuilder = new SqlConnectionStringBuilder(); 16 17 connBuilder.DataSource = @"PC2011052108IXK\SQLEXPRESS"; 18 19 connBuilder.InitialCatalog = "Northwind"; 20 21 connBuilder.IntegratedSecurity = true; 22 23 using (SqlConnection conn = new SqlConnection(connBuilder.ConnectionString)) 24 25 { 26 27 conn.Open(); 28 29 Console.WriteLine("打開成功"); 30 31 SqlCommand cmd = conn.CreateCommand(); 32 33 //定義事務 34 35 SqlTransaction trans; 36 37 //開始事務,創建事務對象,不可以實例化事務對象 38 39 trans = conn.BeginTransaction("MyTransaction"); //通過連接對象創建事務對象 40 41 //把事務對象給執行命令對象 42 43 cmd.Transaction = trans; //把事務跟命令對象進行關聯 44 45 //通過異常來發現錯誤,以至讓事務回滾 46 47 try 48 49 { 50 51 //這個是正確 52 53 cmd.CommandText = "INSERT INTO dbo.CustomerDemographics VALUES('B','這是一個不錯的東西')"; 54 55 cmd.ExecuteNonQuery(); 56 57 //由於主鍵約束,這是錯的 58 59 cmd.CommandText = "INSERT INTO dbo.CustomerDemographics VALUES('A','這是一個不錯的東西')"; 60 61 cmd.ExecuteNonQuery(); 62 63 Console.WriteLine("插入成功"); 64 65 //提交事務 66 67 trans.Commit(); //這一步很重要 68 69 } 70 71 catch (SqlException ex) 72 73 { 74 75 //失敗了就進行回滾 76 77 Console.WriteLine("Error: {0}", ex.Message); 78 79 //回滾 80 81 trans.Rollback(); //事務的重要特性 82 83 Console.WriteLine("回滾成功"); 84 } 85 86 } 87 88 } 89 90 catch (SqlException ex) 91 92 { 93 94 Console.WriteLine(ex.Message); 95 96 } 97 98 finally 99 100 { 101 102 } 103 104 }
2.事務中的命名存儲點
一旦你定義了命名存儲點,只能回滾命名存儲點之后的操作,這是要是情況而使用!
這種情況是當你調用RollBack方法並重載一個命名存儲點的參數,如下代碼所示:
1 using (SqlConnection conn = new SqlConnection(str)) 2 { 3 conn.Open(); 4 SqlTransaction transaction = conn.BeginTransaction(); 5 SqlCommand cmd = conn.CreateCommand(); 6 cmd.CommandText = ""; 7 cmd.Transaction = transaction; 8 //使用命名存儲點 9 transaction.Save("this is point"); //定義命名存儲點,使用Save方法先保存存儲點,定義回滾數據的開始位置 10 11 //這邊是你要回滾的操作代碼,TO DO... 12 13 //把從命名存儲點到這里的操作進行回滾 14 transaction.Rollback("this is point"); //回滾命名存儲點 15 }
3.SQL語句中的事務(SQL Server中的事務其實很復雜的)
1 BEGIN TRANSACTION 2 3 --你需要執行的更新,刪除,插入的語句 4 5 IF(@@ERROR > 0) //這是系統變量,存儲你在執行更新,刪除,插入操作時發生錯誤的記錄編號 6 ROLLBACK 7 ELSE 8 COMMIT
推薦文章:淺談SQL SERVER中事務的ACID
4.說說“TransactionScope”,讓事務更加的簡單
1 using (TransactionScope transactionScope = new TransactionScope()) 2 { 3 try 4 { 5 using (SqlConnection connection = new SqlConnection()) 6 { 7 // TO DO 8 //提交事務,如果有異常,他會自動回滾的 9 transactionScope.Complete(); 10 } 11 } 12 catch (Exception) 13 { 14 //捕獲異常 15 throw; 16 } 17 }
推薦文章:C#綜合揭秘——細說事務
七丶SqlDataAdapter(數據適配器)
1.構造函數
1 四個重載: 2 1. 無參 3 2. SqlDataAdapter(SqlCommand) → 執行命令對象實例 4 3. SqlDataAdapter(String, SqlConnection) → ①只能指定查詢語句 ②連接對象實例 5 4. SqlDataAdapter(String, ConnectionString) → 用 SelectCommand 和一個連接字符串初始化 SqlDataAdapter 類的一個新實例 6 Note:第四個重載就把連接對象和命令對象都包含進去了!
2.填充數據(Fill)
最簡單的填充數據
1 DataSet dataSet = new DataSet(); 2 using (SqlConnection conn = new SqlConnection("")) 3 { 4 conn.Open(); 5 SqlCommand command = conn.CreateCommand(); 6 command.CommandText = "select name,age,address from MyInformation"; 7 SqlDataAdapter dataAdapter = new SqlDataAdapter(command); 8 dataAdapter.Fill(dataSet); //填充數據 9 }
3.使用“SqlCommandBuilder”對數據進行增刪改查
①添加數據
1 using (SqlConnection conn = new SqlConnection(ConnectionString())) 2 { 3 conn.Open(); 4 //構建查詢語句,也可以指定SqlCommand,其中變換的方法有很多 5 SqlDataAdapter da = new SqlDataAdapter("select LastName,FirstName from dbo.Employees", conn); 6 DataSet ds = new DataSet(); 7 da.Fill(ds); 8 //這句話很重要,它會把你在DataSet增加的數據轉化為SQL語句用來更新數據庫 9 SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da); 10 //添加行,實例化一個行對象,注意是用NewRow來創建行 11 DataRow row = ds.Tables[0].NewRow(); 12 row[0] = "Yang"; 13 row[1] = "鬼頭"; 14 ds.Tables[0].Rows.Add(row); //添加到表中 15 da.Update(ds); //把DataSet中表和數據庫進行對比,更新 16 }
②修改數據
1 using (SqlConnection conn = new SqlConnection("")) 2 { 3 SqlDataAdapter da = new SqlDataAdapter("SQL語句或你自己定義的命令對象", conn); 4 DataSet ds = new DataSet(); 5 da.Fill(ds); 6 //很重要的一句話 7 SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da); 8 ds.Tables[0].Rows[12][1] = ""; //修改數據 9 da.Update(ds); 10 //調用Update方法其中隱式的調用了AcceptChanges方法,更新數據集中的數據 11 //如果你繼續使用這個數據集而沒有調用這個方法,在后面的使用會出現異常 12 ds.AcceptChanges(); //這句話可以不寫的 13 }
③刪除數據
1 using (SqlConnection conn = new SqlConnection("")) 2 { 3 SqlDataAdapter da = new SqlDataAdapter("SQL語句或你自己定義的命令對象", conn); 4 DataSet ds = new DataSet(); 5 da.Fill(ds); 6 SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da); 7 //刪除數據 8 ds.Tables[0].Rows[12].Delete(); 9 da.Update(ds); //這邊會隱式調用DataTable的AcceptChanges方法 10 }
Note(很重要的注意點):值得注意的是Update方法已經隱式幫我調用了AcceptChanges,不比擔心狀態為改變刪除數據會報錯,微軟已經幫我們都做好了,其實背后就是做的Table.AcceptChanges()這件事,如果在一般的DataTable中會怎么樣,提交自上次調用 AcceptChanges 以來對該行進行的所有更改,在調用這個方法之后,表中所有更改將會提交,所有行狀態(RowState)狀態都將變為Unchanged,在DataSet中我將會說到這些內容!
4.關於“SqlDataAdapter”中Fill方法的一些討論
簡單的寫一下,MSDN上都有的,查一下就知道了!
1 ★指定填充數據的數量,如: 2 //從第五行到第十行數據填充DataSet 3 //上面的定義錯了 4 //應該是從第六行開始,后面的十條記錄 5 da.Fill(ds,5,10,”MyTable”)
八丶DataSet,DataTable,DataRow,DataColumn
表示數據存放在緩存中,DataSet里面可以包含多個DataTable,DataTable中有多個DataColumn和多個DataRow,包括對各種對DataTable的操作,以及對列和行的操作,在進行DataSet,DataTable進行操作的時候,應該先判斷它們是否為Null,這是最基本的!
1.DataTable,DataRow,DataColumn
①創建自己的DataTable

1 DataTable dt = new DataTable("Table"); 2 DataColumn columnName = new DataColumn(); 3 columnName.ColumnName = "Name"; 4 //columnName.DataType = typeof(string); 5 //注意和上面一句話的比較 6 columnName.DataType = Type.GetType("System.String"); 7 columnName.DefaultValue = "YangCaoGui"; 8 dt.Columns.Add(columnName); //DataColumnCollection的集合 9 DataRow row = dt.NewRow(); //使用NewRow方法來實例化一個行 10 row[columnName] = "WangWei"; //采用索引的方式有很多 11 dt.Rows.Add(row); //DataRowCollection的集合 12 Console.WriteLine("Type: " + dt.Columns[0].DataType.Name);
②使用對象集合初始化器簡化代碼,以及使用“DataColumnCollection”和“DataRowCollection”來操作已添加的行和列
構造函數的訪問修飾符為Internal,通過這兩個集合可以對Column和Row進行“增,刪,改,查”,詳細見MSDN,如Remove,Add,RemoveAt etc!
1 dt.Columns.Add(new DataColumn("Age", typeof(Int32))); 2 dt.Columns.Add(new DataColumn() 3 { 4 ColumnName = "Address", 5 DataType = typeof(string), 6 DefaultValue = "江蘇海安" 7 }); 8 //我們這邊使用Add的方法的第二個重載 9 dt.Rows.Add(new object[] {"11", 44, "222", "yang cao gui"}); 10 //我們也可以對添加好的行和列進行讀取和修改 11 dt.Columns[0].ColumnName = "wang wei"; 12 dt.Rows[0]["wang wei"] = "我把這行這列的值修改了,哈哈";
③使用表達樹快速構建自己的列,詳細的也可以查MSDN

1 public static void DataTableExpression() 2 { 3 DataTable dt = new DataTable("Table"); 4 DataColumn price = new DataColumn("price", typeof(Int32)); 5 DataColumn number = new DataColumn("number", typeof(Int32)); 6 dt.Columns.Add(price); 7 dt.Columns.Add(number); 8 for (int i = 1; i <= 5; i++) 9 { 10 DataRow newRow = dt.NewRo(); 11 newRow["price"] = i; 12 newRow["number"] = i + 5; 13 dt.Rows.Add(newRow); 14 } 15 //顯示表數據 16 for (int i = 0; i < dt.Rows.Count; i++) 17 { 18 Console.WriteLine("Price: {0} , Number:{1}", dt.Rows[i]["price"], dt.Rows[i]["number"]); 19 } 20 //使用Expression來定制自己的Table 21 Console.WriteLine("-----------------------------------"); 22 DataColumn total = new DataColumn("total", typeof(Int32)); 23 dt.Columns.Add(total); 24 //可以使用這樣的方式來定制自己DataTable 25 dt.Columns["total"].Expression = "price * number"; 26 //顯示定制后的數據 27 28 Console.WriteLine("顯示數據"); 29 30 for (int i = 0; i < dt.Rows.Count; i++) 31 { 32 Console.WriteLine("Price: {0} , Number:{1} ,Total:{2}", dt.Rows[i]["price"], dt.Rows[i]["number"], dt.Rows[i]["total"]); 33 } 34 }
2.DataRowState(行狀態),DataRowVersion(行版本)
①DataRowState(行狀態)是“DataRow”中一個很重要的狀態,主要有五個方面:
1 Added → 添加 2 Deleted → 刪除 3 Detached → 分離 4 Modified → 修改 5 Unchanged → 為改變
Note:如果實例化一個行,但沒有加入到任何一個表中,那么它的狀態永遠是Detached,不存在Add,Modified之分,這個是要注意的!
②DataRowVersion(行版本),有四個版本狀態,如下:
1 Current → 最近的行,主要針對Deleted操作之前的行,行狀態的Deleted 2 Default → 行的默認狀態 3 Original → 行的原始值 Added,Modified,Unchanged 4 Proposed → 行的建議值
PS:如果想理解它們,應該要寫一些示例代碼來模擬它們,這樣就能很好的熟悉它們了!
強烈推薦這篇文章:→ 深入.NET DataTable(寫的很仔細,不錯,一定要看的),還有這篇 → 深入.NET DataTable(補遺)。
3.DataSet,DataTable
比較重要的方法:Select,Merge,Copy,Clone,GetChanges等等
關於GetChanges方法:獲取數據改變的地方,它所獲取的是你上次調用AcceptChanges方法之后修改數據的信息,這點要注意了!
4.下面是對DataSet和DataTable講的比較好的文章收集
比較兩個DataTable數據(結構相同)——5萬條數據僅需幾秒
5.關於“DataRelation”和“DataView”的知識也很重要
DataView → 表示用於排序、篩選、搜索、編輯和導航的 DataTable的可綁定數據的自定義視圖,看文章:DataSet,DataTable,DataView
DataRelation → 表示兩個 DataTable 對象之間的父/子關系,看文章:DataRelation(DataSet中父子表)的一個示例
九丶封裝數據庫操作類(這才是精華)
只有充分理解了上面的知識,才能更好的封裝,才能寫出健壯的面向對象數據庫操作類庫,因本人知識有限,簡單的封裝還可以,但是不足以見人,所以收集了了一些好文章,供我們來學習:
1.SqlHelper- -高懸的雙刃劍(到底好用么~~) (提煉更加健壯的代碼)
2.我的DbHelper數據操作類(自定義操作類庫)
3.JSM SqlHelper 2.0 源碼下載(封裝的更細啦,有機會研究研究)
4.微軟原版SQLHelper類(代碼太多,有很多我們會用不到,還有重載的也太多了吧!)
好了就這么多了,想簡單也很簡單,想復雜登天還難,哈哈,還是看個人的選擇把,園子里面這方面的文章也有很多,一搜一大堆,好好研究下就ok了!
結束:寫了一個星期,終於搞完了,肯定還有很多地方沒有涉及到的,大家多多指點...
文章以同步到:程序猿個人文章目錄索引