熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ADO.NET 2.0中的DataSet和DataTable

2013-11-13 10:21:55  來源: .NET編程 

  John Papa的一篇文章《DataSet and DataTable in ADONET 詳細介紹了ADONet 的一些新功能和特性對於利用ADONET開發的程序員來說是值得關注的現介紹如下

  一功能增強的DataTable

  在ADONETx中DataSet完全掩蓋了DataTable的光芒並非DataTable自身功能不夠強大實則是比較DataSet而言很多功能在x版本中受到了限制例如Merge功能在ADONETx版本中如果要合並兩個表只有是通過DataSet的Merge方法才能完成代碼如下

  string sqlAllCustomers = SELECT * FROM Customers

  string cnStr = @Data Source=Initial Catalog=northwindIntegrated Security=True

  

  

  using (SqlConnection cn = new SqlConnection(cnStr))
{
    cnOpen();
    SqlCommand cmd = new SqlCommand(sqlAllCustomers cn);
    SqlDataAdapter adpt = new SqlDataAdapter(cmd);
    DataTable dtCust = new DataTable(Customers);
    adptFill(dtCust);
    dtCustPrimaryKey = new DataColumn[]{dtCustColumns[CustomerID]};
 

  DataTable dtCust = dtCustClone();
    DataRow row = dtCustNewRow();
    row[CustomerID] = ALFKI;
    row[CompanyName] = Some Company;
    dtCustRowsAdd(row);

  DataRow row = dtCustNewRow();
    row[CustomerID] = FOO;
    row[CompanyName] = Some Other Company;
    dtCustRowsAdd(row);

  DataSet ds = new DataSet(MySillyDataSet);
    dsTablesAdd(dtCust);
    dsMerge(dtCust);

  dgTestDataSource = dtCust;
}

  在ADONET 對DataTable作了改進同樣提供了Merge方法因此如上的代碼中如果要合並表dtCust和dtCust就不必再引入DataSet對象了

  dtCustMerge(dtCust

  此外ADONETx版本中DataTable也無法完成Xml文件和數據表之間的轉換這個問題在版本中也得到了改進DataTable也具備了和DataSet對象同樣的操作xml文件的能力包括方法ReadXmlWriteXml等

  DataSet和DataTable在版本中還提供了一個新的屬性RemotingFormat在對DataTable和DataSet對象進行序列化時該屬性標示序列化的格式是二進制還是xml

  二輕量級對象和快速遍歷

  ADONET 中的DataTable提供了CreateDataReader方法(在之前的版本名為GetDataReader)該方法將創建一個DataTableReader對象DataTableReader與DataTable不同它是一個輕量級的對象其支持Disconnected這一點與DataReader(SqlDataReader)不同這些特點決定遍歷DataTableReader對象將更加快速占用的數據資源更少(Disconnected)下面的代碼創建了一個DataTableReader對象並將其綁定到DataGridView控件上

  

  using (SqlConnection cn = new SqlConnection(cnStr))
{
    SqlCommand cmd = new SqlCommand(sqlAllCustomers cn);
    SqlDataAdapter adpt = new SqlDataAdapter(cmd);
    DataTable dtCustomers = new DataTable(Customers);
    adptFill(dtCustomers);
    DataTableReader dtRdr = dsCreateDataReader();
    dgvCustomersDataSource = dtRdr;
}

  和DataReader一樣DataTableReader對象只能向前遍歷可以通過Read方法定位到對象的第一行如果DataTableReader如果是被一個包含有多個數據表的DataSet對象創建DataTableReader也會包含多個結果集通過調用NextResult方法訪問結果集序列

  

  

  using (SqlConnection cn = new SqlConnection(cnStr))
{
    // Create the Command and Adapter
    SqlCommand cmd = new SqlCommand(sqlAllCustomers cn);
    SqlDataAdapter adpt = new SqlDataAdapter(cmd);

  // Create a DataTable and fill it
    DataTable dtCustomers = new DataTable(Customers);
    adptFill(dtCustomers);

  DataSet ds = new DataSet();
    dsTablesAdd(dtCustomers);
    adptSelectCommand = new SqlCommand(SELECT * FROM Orders cn);
    adptFill(ds Orders);

  // Create the DataTableReader (it is disconnected)
    using(DataTableReader dtRdr = dsCreateDataReader())
    {
        do
        {
            ConsoleWriteLine(******************************);
            while (dtRdrRead())
            {
                ConsoleWriteLine(dtRdrGetValue()ToString());
            }
        }
        while (dtRdrNextResult());
    }
}

  DataTableReader對象中數據表的順序與DataSet中的數據表順序一致如果你需要制定特定的順序可以通過重載CreateDataReader方法來實現

  三裝載數據

  可以通過DataTableReader對象生成DataTable和DataSet利用DataTable和DataSet在版本中新引入的方法Load可以傳遞DataTableReader或者任何實現IDataReader接口的類對象下面的代碼就是通過Load方法將dt的數據傳遞到新的數據表dt

  DataTableReader dtRdr = dtCreateDataReader()

  DataTable dt = new DataTable()

  dtLoad(dtRdr)

  在使用Load方法裝載多行數據時可以先調用BeginLoadData方法來避免通知(notifications)索引維護(index maintenance)以及約束檢查(constraint checking)然後再通過EndLoadData方法返回數據

  四性能改進

  這恐怕是ADONET 最激動人心的改進x版本中隨著數據的增大在使用DataTable和DataSet對象時性能是不能令人滿意的ADONET 對索引引擎作了很大的改進使得的數據訪問能力獲得極大的提高以下面的測試代碼為例

  

  

  DataTable dt = new DataTable(foo);
DataColumn pkCol = new DataColumn(ID TypeGetType(SystemInt));
pkColAutoIncrement = true;
pkColAutoIncrementSeed = ;
pkColAutoIncrementStep = ;
dtColumnsAdd(pkCol);
dtPrimaryKey = new DataColumn[] { pkCol };
dtColumnsAdd(SomeNumber TypeGetType(SystemInt));
dtColumns[SomeNumber]Unique = true;

  int limit = ;
int someNumber = limit;
DateTime startTime = DateTimeNow;
for (int i = ; i <= limit; i++)
{
    DataRow row = dtNewRow();
    row[SomeNumber] = someNumber—;
    dtRowsAdd(row);
}

  TimeSpan elapsedTime = DateTimeNow startTime

  MessageBoxShow(dtRowsCountToString() + rows loaded in + elapsedTimeTotalSeconds + seconds

  分別在Visual StudioNET 和Visual Studio 環境下運行結果比較如下


  Iterations

  ADONET

  ADONET

  

  

  

  

  

  

  

  

  


From:http://tw.wingwit.com/Article/program/net/201311/13399.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.