ADO.Net 型別化DataSet的簡單介紹

NO IMAGE

一、弱型別DataSet的缺點:
1、只能通過列名引用,dataset.Tables[0].Rows[0][“Age”],如果寫錯了列名編譯時不會發現錯誤,因此開發時必須要記著列名。
2、int age=Convert.ToInt32(dataset.Rows[0][“Age”]),取到的欄位的值是object型別,必須小心翼翼的進行型別轉換,不僅麻煩,而且容易出錯。
3、將DataSet傳遞給其他使用者,使用者很難識別出有哪些列可以供使用。
4、執行時才能知道所有列名,資料繫結麻煩,無法使用Winform、ASP.Net的快速開發功能。
5、自己動手寫強型別DataSet(型別化DataSet,TypedDataSet),建立繼承自DataSet的PersonDataSet類,封裝出int? Age等屬性和bool IsAgeNull等方法,向PersonDataSet中填充。

二、VS自動生成強型別DataSet:
1、步驟:新增->新建項->資料集
2、將表從伺服器資源管理器拖放到DataSet中。注意拖放過程是自動根據表結構生成強型別DataSet等類,沒有把資料也拖過來,程式還是連的那個資料庫,自動將資料庫連線字串寫在了App.Config中。
3、程式碼中使用DataSet示例:CC_RecordTableAdapter adapter=new CC_RecordTableAdapter();如何得知Adapter的類名?選中DataSet中下半部分的Adapter,Name屬性就是類名。需要右鍵點選類名->解析
4、取得所有的資料:adapter.GetData(),例子程式:遍歷顯示所有資料,i<adapter.GetData().Count;adapter.GetData()[i].Age。
5、常見問題:類名敲不對,表名 TableAdapter,表名 DataTable,表名 Row,然後用“解析”來填充類名。
6、常見問題:類的內部定義的類要通過包含namespace的全名來引用,不能省略。類的內部定義的類就能避免同一個namespace下類不能重名的問題。

三、更新DataSet:
1、呼叫Adapter的Update方法就可以將DataSet的改變儲存到資料庫。adapter.Update(datatable);
2、要呼叫Update方法更新必須設定資料庫主鍵,同樣,Delete方法也是如此;
3、常見錯誤:“當傳遞具有已修改行的DataRow集合時,更新要求有效的UpdateCommand”,要為表設定主鍵。“誰都變了,唯有主鍵不會變”,程式要通過主鍵來定位要更新的行。忘了設主鍵怎麼辦?先到資料庫中設定主鍵,然後在DataSet的對應DataTable上點選右鍵,選擇“配置”,在對話方塊中點選“完成”。好習慣:所有表都要設定主鍵!!!看看為什麼會自動幫我們GetData、Update、Delete。   
現在做個簡單的練習:
第一步:新增一個資料庫,名為DB1.mdf(表T_Persons含有Id,Name,Age欄位)
第二步:新增一個應用程式配置檔案:App.config檔案,其程式碼如下:

複製程式碼 程式碼如下:
<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name=”型別化DataSet.Properties.Settings.DB1ConnectionString”
            connectionString=”Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DB1.mdf;Integrated Security=True;User Instance=True”
            providerName=”System.Data.SqlClient” />
    </connectionStrings>
</configuration>

第三步:再新增一個資料集檔案:DataSetPersons.xsd,並將表T_Persons拖到資料集上。
第四步:在窗體Form1介面放一按鈕,當單擊它時逐個地顯示出資料庫表裡的所有Name。窗體程式碼如下:

複製程式碼 程式碼如下:
  using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Linq;
  using System.Text;
  using System.Windows.Forms;
  using 型別化DataSet.DataSetPersonsTableAdapters;

 namespace 型別化DataSet
 {
     public partial class Form1 : Form
     {
         public Form1()
         {
             InitializeComponent();
         }

         private void Show_Click(object sender, EventArgs e)
         {
             //表名 TableAdapter,表名 DataTable,表名 Rows,然後用“解析”來填充類名
             T_PersonsTableAdapter adapter = new T_PersonsTableAdapter();
             型別化DataSet.DataSetPersons.T_PersonsDataTable personsTable = adapter.GetData();
             for (int i = 0; i < personsTable.Count; i )//假如是personsTable.Rows.Count則變為弱型別了
             {
                 型別化DataSet.DataSetPersons.T_PersonsRow person = personsTable[i];
                 MessageBox.Show(person.Name);
             }
         }
     }
 }

提醒:對於上面引用類內部的類的情況,寫類時的方法是:表名 TableAdapter,表名 DataTable,表名 Rows,然後用“解析”來填充類名。

四、其它問題:
1、插入新行,呼叫Insert方法。
2、資料庫表中增加了欄位後怎麼辦?DataSet設計器中點【配置】,對話方塊中點【查詢生成器】,勾選新增加的欄位即可。刪除欄位同樣如此。
3、要修改欄位就要重新配置生成,這就是強型別DataSet的弱點。
4、常見錯誤:報錯、資料為空。判斷列的值為空的方法:Is**Null
5、為什麼Select方法會填充、Update方法會更新、Insert方法會插入?看看Adapter的SelectCommand等屬性就知道了,都是那些SQL語句在起作用,如果有需要完全可以手工調整。  如: 
複製程式碼 程式碼如下:
     personsTable[0].Name = “Lucy”;
            adapter.Update(personsTable);//呼叫Update方法將對資料集的修改更新到資料庫
            adapter.Insert(“John”, 50);

您可能感興趣的文章:

ASP.NET中DataTable與DataSet之間的轉換示例ASP.NET 繫結DataSet中的多個表asp.net DataSet進行排序ASP.NET用DataSet匯出到Excel的方法asp.net下DataSet.WriteXml(String)與(Stream)的區別asp.net下用DataSet生成XML的問題詳細說明asp.net中datareader 和 dataset 的區別ASP.NET中實現把Json資料轉換為ADO.NET DataSet物件asp.net如何將DataSet轉換成josn並輸出.NET中如何將文字檔案的內容儲存到DataSet