使用ADO.NET2.0提升數據交互性能

 1使用多數據結果集(僅限2005)
   SQL Server 2005提供了在同一條連接上可以同時傳遞多個沒有遊標結構(cursorless)的結果集(也稱爲默認結果集),此功能稱爲 Multiple Active Resultsets(MARS)。如此可以節省需要同時打開的連接數,但要注意的是連接字符串設置要加上 MultipleAct-iveResultSets=true 屬性,否則默認不啓動多數據結果集的功能。

  

string connstr = "server=(local);database=northwind;integrated security=true; "; SqlConnection conn = new SqlConnection(connstr); conn.Open(); SqlCommand cmd1 = new SqlCommand("select * from customers", conn); SqlCommand cmd2 = new SqlCommand("select * from orders", conn); SqlDataReader rdr1 = cmd1.ExecuteReader(); // next statement causes an error prior to SQL Server 2005 SqlDataReader rdr2 = cmd2.ExecuteReader(); // now you can reader from rdr1 and rdr2 at the same time.

 

2.使用SqlBulkCopy批量裝載數據(僅限SqlClient)

  以往訪問 SQL Server 2000 時,若有大量的數據記錄需要添加到數據庫內,例如從主機系統或是 NCR Teradata、Oracle等數據庫系統下載大量數據記錄,我們想要將它們快速添加到 SQL Server 2000中,可以有的選擇是調用 T-SQL 的 Bulk Insert 語法、通過Linked Server 執行 SELECT INTO 語法或是執行 bcp.exe 工具程序,以及通過 DTS 的 Bulk Insert Task 或啓動Transform Data Task 的快速裝載(Use Fast Load)設置。


  但若要通過自行編寫的程序完成批次裝載,只能以 C/C++ 調用 OLEDB 或 ODBC 的 Bulk API,無法通過 ADO.NET 或 ADO 等對象來執行。

  ADO.NET 2.0 的 SqlClient 提供了一個新的類稱爲 SqlBulkCopy,它讓 DataSet 內大量的數據或是 DataReader通過數據流(Stream)直接讀取大量的記錄,可以快速將這些記錄添加到目的數據庫的數據表中。但要注意的是它並非如我們一般用的 bcp.exe工具程序,可以從某個符號分隔文件讀取大量數據,選擇性地搭配格式文件(Format File)將記錄裝載到數據庫中,或是將數據庫內的數據導出成爲一個文件。但由於DataSet 能集成 XML 數據,因此依然可以採用 SqlBulkCopy 類型,輕鬆地通過 DataSet 將 XML 文件數據大量轉入到數據庫。



  可以利用SqlBulkCopy類快速寫入大批量數據,針對SQL Server的優化,可以寫入DataRow數據,DataTable,DataReader,並且可以映射不同的數據列名

  WriteToServer(DataTable)寫入數據表

  WriteToServer(DataRow[])批次寫入數據行

  WriteToServer(DataTable ,DataRowState)按行狀態寫入數據庫表

WriteToServer(IDataReader)寫入DataReader對象


  下面是個示例:
 

using (SqlConnection sqlcon = new SqlConnection("Data Source=192.168.80.242;user id=oa;password=oapassword;initial catalog=test")) { sqlcon.Open(); using (SqlBulkCopy bcp = new SqlBulkCopy(sqlcon)) { bcp.BulkCopyTimeout = 3000; bcp.DestinationTableName = "dbo.Test01"; bcp.ColumnMappings.Add("id""id"); bcp.ColumnMappings.Add("name1""name1"); bcp.ColumnMappings.Add("name2""name2"); bcp.ColumnMappings.Add("name3""name3"); //映射到不同名列 bcp.ColumnMappings.Add("changedname4", "name4"); bcp.WriteToServer(dt); sqlcon.Close(); } }


但是SqlBulkCopy使用時要注意以下幾點:

  1   確認確實需要大容量更新在執行此操作,(幾十行的數據請儘量使用別的渠道把). 

  2    確認數據一致性,與檢查機制,以免遇到主鍵衝突,數據不符格式等意外。 

  3   SqlBulkCopy操作可能會導致對目標表元數據的更改(例如,禁用約束檢查時)。如果出現這種情況,訪問大容量插入表的併發快照隔離事務將失敗。

  4   SqlBulkCopy將向數據庫下大容量更新鎖,請注意併發性,以免其他連接因長時間等待而超時。

3.二進序列制化的Dataset

  Dataset有個好屬性是支持序列化,但是有很多人對其提出了批評。不是這些人不喜歡Dataset支持序列化,而是序列化後的Dataset真的是太肥了。大量的

  <xs:element name=””,type…佔用了大量的空間以至讓人難以忍受。


  現在我們只需要設置 RemotingFormat 屬性爲SerializationFormat.Binary(默認是SerializationFormat.XML),則在序列化時完全採用二進制的數據格式,如此數據較小,因而較有效率。(官方的觀點是縮爲SerializationFormat.XML的1/4)。

4 結果集直接裝載DataTable

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

 

DataTableReader dtRdr = dt1.CreateDataReader(); DataTable dt2 = new DataTable(); dt2.Load(dtRdr);


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

 5.輕量級對象和快速遍歷

  ADO.NET 2.0中的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"); adpt.Fill(dtCustomers); DataTableReader dtRdr = ds.CreateDataReader(); dgvCustomers.DataSource = dtRdr; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章