ADO.NET - 全面梳理


目錄:

  1. 簡單的介紹下ADO.NET
  2. SqlConnection(連接對象)
  3. SqlCommand(命令對象)
  4. SqlParameter(Sql參數)
  5. SqlDataReader(數據流讀取器)
  6. SqlTransaction(事務)
  7. SqlDataAdapter(數據適配器)
  8. DataSet,DataTable,DataRow,DataColumn
  9. 封裝數據庫操作類(這才是精華) 

一丶簡單的介紹下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.創建連接對象

View Code
1 SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder()
2  {
3      DataSource = "",
4      InitialCatalog = "",
5      UserID = "",
6      Password = ""
7  };
8 SqlConnection connection = new SqlConnection(connectionStringBuilder.ToString());

  3.打開和關閉連接對象(使用Using來關閉連接)

View Code
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”值,所以需要對結果進行判斷,如下:

View Code
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中的類型  

View Code
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

    代碼如下:

View Code
 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.基本用法

View Code
 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:判斷讀取的數據流是否關閉

      所以靈活運用上面的屬性講增強代碼的可讀性和健壯性,綜合示例:

View Code 

    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:所以在對數據進行讀取時要有針對的使用一些性能高的方法,也不是說要追求性能,只是這是一種習慣,對於大多數讀取數據庫的方法使用索引來讀取無疑是最快,記住一句話,“當性能沒有成為問題的時候,不要過度的去優化它”,高效而又優美的使用這些方法,才是王道!

    推薦文章:SqlDataReader 提前終止的性能問題

    PS:我這里的總結其實是以前在園子看到一個人寫的,找了半個小時都沒找到,如果有人看到過,發個鏈接給我,我補上!

  5.SqlDataReader和DataSet的討論

    推薦文章:談談Asp.net網站優化一:SqlDataReader和DataSet的選擇

 

六丶SqlTransaction(事務)

   1.代碼中的事務    

    現在代碼中基本使用存儲過程來控制事務的處理,通過代碼進行控制事務也是我們學習ADO.NET的任務之一!

    事務是在連接對象之后創建,並把它跟命令對象進行關聯,使用try.....Catch捕獲異常,然后調用RollBack方法回滾事務!

    Commit:提交

    RollBack:回滾

View Code
  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

          深入sql server中的事務

  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 

View Code
 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

View Code
 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.Select使用小心得

    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了!

結束:寫了一個星期,終於搞完了,肯定還有很多地方沒有涉及到的,大家多多指點...

文章以同步到:程序猿個人文章目錄索引


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM