C#資料庫開發讀書筆記3---DataTable及資料表條件約束的應用

來源:互聯網
上載者:User

標籤:c#、ado.net

8、DataTable建立資料表

    DataTable表示一個記憶體內關係資料的表,可以獨立建立和使用,也可以由其他.NET架構對象使用,

 最常見的情況是作為DataSet的成員使用。

 DataTable對象可通過使用DataTable建構函式來建立,或者可通過將建構函式參數傳遞到DataSet

 的Tables屬性的Add方法來建立。

 DataTable對象可通過使用DataAdapter對象的Fill方法或FillSchema方法在DataSet內建立,或者可使用

 DataSet的ReadXml、ReadXmlSchema或InferXmlSchema方法從預定義的或推斷的XML架構中建立。

 將DataTable添加為一個DataSet的Tables集合的成員後,不能再將其添加至任何其他DataSet的表的集合。

 //以下代碼建立DataTable對象的執行個體,並為其指定名稱"Customers"

 DataTable workTable = new DataTable("Customers");

 

 //以下代碼建立DataTable執行個體,方法是:將其添加至DataSet的Tables集合。

 DataSet custDS = new DataSet();

 DataTable custTable = custDS.Tables.Add("CustTable");

 

 

 8.1、定義資料表的架構

     表的架構或結構由列和約束表示,使用DataColumn對象以及ForeignKeyConstraint和UniqueConstraint

  對象定義DataTable的架構。表中的列可以映射到資料來源中的列、包含從運算式計算所得的值、自動遞增

  它們的值,或包含主索引值。

      8.1.1、在表中添加列

       DataTable包含了由表的Columns屬性引起的DataColumn對象的集合。這個列的集合與任何約束一起

    定義表的架構或結構。

    通過使用DataColumn建構函式,或者通過調用表的Columns屬性的Add方法可以在表內建立DataColumn

    對象。Add方法將接受可選的ColumnName、DataType和Expression參數,並將建立新的DataColumn

    作為集合的成員。

   

    //以下代碼將4行添加到DataTable

    DataTable workTable = new DataTable("Customers");

    DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));

    workCol.AllowDBNull = false;

    workCol.Unique = true;

    workTable.Columns.Add("CustLName", typeof(String));

    workTable.Columns.Add("CustFName", typeof(String));

    workTable.Columns.Add("Purchases", typeof(Double));

   

    如果尚為給某個列提供列名,則將該列添加至DataColumnCollection時,該列會得到從"Columns"開始

    遞增的預設名稱ColumnN。

   8.1.2、建立運算式列

       可以為列定義運算式,讓它能夠包含同一行中其它列值或表中多行的列值計算而得的值。

    //執行個體代碼

    workTable.Columns.Add("Total", typeof(Double));

    workTable.Columns.Add("SalesTax", typeof(Double), "Total * 0.086");

    運算式可以引用其他運算式列,但循環參考(其中兩個運算式相互引用)將產生異常。

   

   8.1.3、建立Autoincrement列

       要確保列中的值唯一,可將列值設定為在表中添加新行時自動遞增。

    //以下代碼建立從200開始並以3為增量進行添加的列

    DataColumn workColumn = workTable.Columns.Add("CustomerID", typeof(Int32));

    workColumn.AutoIncrement = true;

    workColumn.AutoIncrementSeed = 200;

    workColumn.AutoIncrementStep = 3;

   

   8.1.4、定義主鍵

       在將一個單獨的DataColumn標識為DataTable的PrimaryKey時,表會自動將列的AllowDBNull屬性

    設定為false,並將Unique屬性設定為true。如果是多列主鍵,則只有AllowDBNull屬性自動化佈建為false。

    //範例程式碼

    workTable.PrimaryKey = new DataColumn[]{workTable.Columns["CustID"]};

    //或採用以下代碼

    DataColumn[] myColArray = new DataColumn[1];

    myColArray[0] = workTable.Columns["CustID"];

    workTable.PrimaryKey = myColArray;

   

    //下面樣本將兩列定義為主鍵

    workTable.PrimaryKey = new DataColumn[]{workTable.Columns["CustLName"],

                               workTable.Columns["CustFName"]};

         

    //或者採用以下代碼

    DataColumn[] myKey = new DataColumn[2];

    myKey[0] = workTable.Columns["CustLName"];

    myKey[1] = workTable.Columns["CustFName"];

    workTable.PrimaryKey = myKey;

   

      8.1.5、添加約束

       ADO.NET中有兩種約束: ForeignKeyConstraint和UniqueConstraint。預設情況下,通

    過將DataRelation添加至DataSet來建立兩個或多個表之間的關係時,兩種約束會自動建立。

    但是也可以在建立關係時,通過指定createConstraints = false 禁用這一行為。

   

    //外鍵

    ForeignKeyConstraint可以限制並傳播對相關列的更改。根據列的ForeignKeyConstraint屬性,

    並且如果DataSet的EnforceConstraints屬性是 true ,對父行執行某些特定操作將會導致異常。

    例如:如果ForeignKeyConstraint的DeleteRule屬性是None,那麼在父行有子行的情況下,則無法刪除父行。

   

    //範例程式碼

    ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK");

    custDS.Tables["CustTable"].Columns["CustomerID"],

    custDS.Tables["OrdersTable"].Columns["CustomerID"]);

    custOrderFK.DeleteRule = Rule.None;

   

    //不能刪除具有訂單的顧客

    custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);

   

    //唯一鍵

    //以下代碼為DataTable的兩列建立UniqueConstraint

    DataTable custTable = custDS.Tables["Customers"];

    UniqueConstraint custUC = new UniqueConstraint(

    new DataColumn[]{custTable.Columns["CustomerID"], custTable.Columns["CompanyName"]});

    custDS.Tables["Customers"].Constraints.Add(custUC);

   

9、在資料表中操作資料

    9.1、將資料添至表中

     添加新行可以聲明一個DataRow類型的變數。調用NewRow方法,將返回新的DataRow對象。然後DataTable

  會根據表的結構按DataColumnCollection的定義建立DataRow對象。

  //範例程式碼

  DataRow workRow = workTable.NewRow();

  workRow["CustLName"] = "Smith";

  workRow[1] = "Smith";

  workTable.Rows.Add(workRow);

 

  //也可以通過傳入值得數組,調用Add方法來添加新行

  workTable.Rows.Add(new Object[]{1, "Smith"});

  注意: 將類型化為Object值得數組傳遞到Add方法,可在表內建立新行並將其列值設定為對象數組中的值,

  數組中的值會根據它們在表中出現的順序相繼與各行匹配。

  //以下樣本將10行添加至建立的Customers表中

  DataRow workRow;

  for (int i = 0; i < 10; i++)

  {

   workRow = workTable.NewRow();

   workRow[0] = i;

   workRow[1] = "CustName" + i.ToString();

   workTable.Rows.Add(workRow);

  }

 

 9.2、查看錶中資料

         可以使用DataTable的Rows和Columns集合來訪問DataTable中的內容。也可以根據包括搜尋標準、排序次序

  和行狀態等特定標準,使用DataTable.Select方法返回DataTable中資料的子集。此外,用主索引值搜尋特定

  行時,還可使用DataRowCollection的Find方法。

      DataTable對象的Select方法返回一組與指定條件匹配的DataRow對象。Select採用篩選條件運算式、

  排序運算式和DataViewRowState的選擇性參數。篩選條件運算式根據DataColumn值(例如 LastName = ‘Smith‘),

  排序運算式遵循用於為列排序的標準SQL約定,例如LastName ASC, FirstName ASC。

      如果對DataTable的Select方法執行多次調用,可先為DataTable建立DataView來提高效能。建立DataView

  會為表中的行編製索引。然後,Select方法會使用該索引,這樣將顯著縮短產生查詢結果的時間。


本文出自 “八部天龍” 部落格,請務必保留此出處http://1224517743.blog.51cto.com/2643474/1610235

C#資料庫開發讀書筆記3---DataTable及資料表條件約束的應用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.