免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
使用SqlBulkCopy進(jìn)行數(shù)據(jù)大批量的遷移
在ASP.NET 2.0中提供了一個(gè)新的類(lèi)SqlBulkCopy類(lèi),它在性能上的優(yōu)勢(shì)更超過(guò)了上面的方法,它可以通過(guò)讓DataSet或是DataReader中大量的數(shù)據(jù)通過(guò)數(shù)據(jù)流直接進(jìn)行裝載,然后可以將這些記錄添加到指定的數(shù)據(jù)表中。
  SqlBulkCopy類(lèi)只有在SQL Server的表中寫(xiě)入數(shù)據(jù),但在使用其它的數(shù)據(jù)庫(kù)時(shí),可以通過(guò)數(shù)據(jù)源來(lái)使用,SqlBulkCopy類(lèi)主要包括一個(gè)實(shí)例方法WriteToServer,它用來(lái)把數(shù)據(jù)從一個(gè)數(shù)據(jù)源傳輸?shù)搅硗庖粋€(gè)數(shù)據(jù)源。WriteToServer的方法可以快速的寫(xiě)入DataRow數(shù)組數(shù)據(jù),DataTable和DataReader。在實(shí)際開(kāi)發(fā)的過(guò)程中,可以視情況而定,選擇我們所喜歡的方法,我們看它使用的方法:
  WriteToServer(DataTable)寫(xiě)入數(shù)據(jù)表
  WriteToServer(DataRow)批次寫(xiě)入數(shù)據(jù)行
  WriteToServer(DataTable,DataRowState)按行狀態(tài)寫(xiě)入數(shù)據(jù)庫(kù)表
  WriteToServer(DataReader)寫(xiě)入DataReader對(duì)象
  在多數(shù)情況下,我們選擇最好的方法是DataReader對(duì)象,因?yàn)镈ataReader是一個(gè)讀取只向前和只讀流的方式,所以它要比DataTable和DataRows更快,我們現(xiàn)在來(lái)看看下面的代碼,它用來(lái)把數(shù)據(jù)從一張表中傳輸?shù)搅硪粡埍碇小?/div>
  代碼清單:
   string strConnection = ConfigurationManager.AppSettings["conStr"].ToString();//讀取Web.config文件中的數(shù)據(jù)庫(kù)連接字符串
  SqlConnection sourceconnection = new SqlConnection(strConnection);//數(shù)據(jù)的連接方式是SQL Server
  sourceconnection.Open();//打開(kāi)數(shù)據(jù)庫(kù)連接
  SqlCommand cmd = new SqlCommand("Select * from MSreplication_options");//通過(guò)命令來(lái)讀取SQL語(yǔ)句
  cmd.Connection = sourceconnection;//獲取連接方式
  SqlDataReader reader = cmd.ExecuteReader();//開(kāi)始執(zhí)和結(jié)果集,獲取DataReader記錄集
  //連接目標(biāo)數(shù)據(jù)庫(kù)連接,并且打開(kāi)數(shù)據(jù)庫(kù)連接方式,在此由于調(diào)用同一個(gè)數(shù)據(jù)庫(kù),連接字符串沒(méi)有變
  SqlConnection destinationConnection = new SqlConnection(strConnection);
  destinationConnection.Open();
  //調(diào)用SqlBulkCopy類(lèi)的方法
  SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection);
  //獲取目標(biāo)表的名稱(chēng)
  bulkCopy.DestinationTableName = "destination";
  //寫(xiě)入DataReader對(duì)象
  bulkCopy.WriteToServer(reader);
  //關(guān)閉各個(gè)對(duì)象
  reader.Close();
  sourceconnection.Close();
  destinationConnection.Close();
  上例中,我們使用的是SQL Server 2005的master數(shù)據(jù)庫(kù),我們?cè)谑褂?font style="BACKGROUND-COLOR: #ffff00">SqlBulkCopy的時(shí)候,需要了解一下它的幾個(gè)重要的屬性:
  BatchSize:屬性的整數(shù)值;或者如果未設(shè)置任何值,則為零。每一批次中的行數(shù)。在每一批次結(jié)束時(shí),將該批次中的行發(fā)送到服務(wù)器。
  BulkCopyTimeOu:超時(shí)之前操作完成所允許的秒數(shù)。如果操作超時(shí),事務(wù)便不會(huì)提交,而且所有已復(fù)制的行都會(huì)從目標(biāo)表中移除。
  ColumnMappings:返回 SqlBulkCopyColumnMapping 項(xiàng)的集合。列映射定義數(shù)據(jù)源中的列和目標(biāo)表中的列之間的關(guān)系。如果數(shù)據(jù)源和目標(biāo)表具有相同的列數(shù),并且數(shù)據(jù)源中每個(gè)源列的序號(hào)位置匹配相應(yīng)目標(biāo)列的序號(hào)位置,則無(wú)需 ColumnMappings 集合。但是如果列計(jì)數(shù)不同,或序號(hào)位置不一致,則必須使用 ColumnMappings,以確保將數(shù)據(jù)復(fù)制到正確的列中。
  DestinationTableName:指定的目標(biāo)表中。
  NotifyAfter:屬性的整數(shù)值,或者如果未設(shè)置該屬性,則為零。定義在生成通知事件之前要處理的行數(shù)。
  在ColumnMappings屬性中,我們可以看到SqlBulkCopyColumnMapping 項(xiàng),它主要是用來(lái)定義SqlBulkCopy實(shí)例的數(shù)據(jù)源中的列與該實(shí)例的目標(biāo)表中的列之間的映射。
  結(jié)合著上面SqlBulkCopy的屬性我們?cè)賮?lái)看一個(gè)綜合的例子,此例中我們使用DataTable:
  在本例中,我先自己建立一個(gè)數(shù)據(jù)庫(kù)SqlBulkCopySample,然后建立一個(gè)表TblOrder,它主要是用來(lái)把Northwind數(shù)據(jù)庫(kù)中的Orders表數(shù)據(jù)全導(dǎo)進(jìn)來(lái),所以它的表結(jié)構(gòu)基本上和Orders一樣,它們以應(yīng)的關(guān)系如下:
   ID (OrderID): int
  Name (ShipName): nvarchar(40)
  Address (ShipAddress): nvarchar(60)
  City (ShipCity): nvarchar(15)
  然后在Northwind數(shù)據(jù)中創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,如下:
  CREATE PROCEDURE dbo.SelectOrders
  AS
  SELECT OrderID, ShipName, ShipAddress, ShipCity
  FROM Orders
  我們?cè)陧?yè)面中增加一個(gè)按鈕的點(diǎn)擊事件,當(dāng)事件觸發(fā)的時(shí)候,執(zhí)行的代碼如下:   private void btnStart_Click(object sender, EventArgs e)
  {
  String sourceConnectionString =
  "Data Source=127.0.0.1;Initial Catalog=Northwind;Integrated Security=True";
  String destinationConnectionString =
  "Data Source=127.0.0.1;;Initial Catalog=SqlBulkCopySample;Integrated Security=True";
  DataTable data = SelectDataFromSource(sourceConnectionString);//獲取數(shù)據(jù)
  CopyDataToDestination(destinationConnectionString, data);//復(fù)制數(shù)據(jù)
  }
  獲取數(shù)據(jù)非常簡(jiǎn)單,它只是通過(guò)執(zhí)行存儲(chǔ)過(guò)程返回一個(gè)DataTable的查詢結(jié)果集,如下:
   private DataTable SelectDataFromSource(String connectionString)
  {
  DataTable data = new DataTable();
  using (SqlConnection connection = new SqlConnection(connectionString))
  {
  SqlCommand command = new SqlCommand("SelectOrders", connection);
  command.CommandType = CommandType.StoredProcedure;
  connection.Open();
  SqlDataReader reader = command.ExecuteReader();
  data.Load(reader);
  }
  return data;
  }
  接著,就執(zhí)行數(shù)據(jù)復(fù)制的操作,此部分的代碼為核心的部分,首先我們通過(guò)創(chuàng)建四個(gè)SqlBulkCopyColumnMapping對(duì)象,然后把兩個(gè)數(shù)據(jù)庫(kù)中的表之間的一一對(duì)應(yīng)關(guān)系表述出來(lái),然后設(shè)置好BatchSize及BulkCopyTimeout屬性,然后返回 SqlBulkCopyColumnMapping 項(xiàng)的集合,接著定義好目標(biāo)表的名稱(chēng),以SqlRowsCopied事件處理程序,在定義在生成通知事件之前要處理的行數(shù)時(shí),然后調(diào)用WriteToServer(DataTable) 方法寫(xiě)入數(shù)據(jù)表,結(jié)束數(shù)據(jù)的復(fù)制,如下:     private void CopyDataToDestination(String connectionString, DataTable table)
  {
  SqlBulkCopyColumnMapping mapping1 =
  new SqlBulkCopyColumnMapping("OrderID", "ID");
  SqlBulkCopyColumnMapping mapping2 =
  new SqlBulkCopyColumnMapping("ShipName", "Name");
  SqlBulkCopyColumnMapping mapping3 =
  new SqlBulkCopyColumnMapping("ShipAddress", "Address");
  SqlBulkCopyColumnMapping mapping4 =
  new SqlBulkCopyColumnMapping("ShipCity", "City");
  SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString);
  bulkCopy.BatchSize = 100;
  bulkCopy.BulkCopyTimeout = 5;
  bulkCopy.ColumnMappings.Add(mapping1);
  bulkCopy.ColumnMappings.Add(mapping2);
  bulkCopy.ColumnMappings.Add(mapping3);
  bulkCopy.ColumnMappings.Add(mapping4);
  bulkCopy.DestinationTableName = "tblOrder";
  bulkCopy.SqlRowsCopied +=
  new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
  bulkCopy.NotifyAfter = 200;
  bulkCopy.WriteToServer(table);
  }
  在bulkCopy_SqlRowsCopied的處理中,我只簡(jiǎn)單的通過(guò)展現(xiàn)給用戶一個(gè)友好的提示信息讓你可以知道目前有多少行被復(fù)制成功。代碼如下:     private void bulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
  {
  MessageBox.Show
  (String.Format("{0} Rows have been copied.", e.RowsCopied.ToString()));
  }
  這樣,在平時(shí)的開(kāi)發(fā)中,我們可以靈活的在ASP.NET中使用SqlBulkCopy幫助我們復(fù)制大量的數(shù)據(jù)之間的數(shù)據(jù)源和數(shù)據(jù)表,并改善應(yīng)用程序的性能。
  獲取數(shù)據(jù)非常簡(jiǎn)單,它只是通過(guò)執(zhí)行存儲(chǔ)過(guò)程返回一個(gè)DataTable的查詢結(jié)果集,如下:
   private DataTable SelectDataFromSource(String connectionString)
  {
  DataTable data = new DataTable();
  using (SqlConnection connection = new SqlConnection(connectionString))
  {
  SqlCommand command = new SqlCommand("SelectOrders", connection);
  command.CommandType = CommandType.StoredProcedure;
  connection.Open();
  SqlDataReader reader = command.ExecuteReader();
  data.Load(reader);
  }
  return data;
  }
  接著,就執(zhí)行數(shù)據(jù)復(fù)制的操作,此部分的代碼為核心的部分,首先我們通過(guò)創(chuàng)建四個(gè)SqlBulkCopyColumnMapping對(duì)象,然后把兩個(gè)數(shù)據(jù)庫(kù)中的表之間的一一對(duì)應(yīng)關(guān)系表述出來(lái),然后設(shè)置好BatchSize及BulkCopyTimeout屬性,然后返回 SqlBulkCopyColumnMapping 項(xiàng)的集合,接著定義好目標(biāo)表的名稱(chēng),以SqlRowsCopied事件處理程序,在定義在生成通知事件之前要處理的行數(shù)時(shí),然后調(diào)用WriteToServer(DataTable) 方法寫(xiě)入數(shù)據(jù)表,結(jié)束數(shù)據(jù)的復(fù)制,如下:     private void CopyDataToDestination(String connectionString, DataTable table)
  {
  SqlBulkCopyColumnMapping mapping1 =
  new SqlBulkCopyColumnMapping("OrderID", "ID");
  SqlBulkCopyColumnMapping mapping2 =
  new SqlBulkCopyColumnMapping("ShipName", "Name");
  SqlBulkCopyColumnMapping mapping3 =
  new SqlBulkCopyColumnMapping("ShipAddress", "Address");
  SqlBulkCopyColumnMapping mapping4 =
  new SqlBulkCopyColumnMapping("ShipCity", "City");
  SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString);
  bulkCopy.BatchSize = 100;
  bulkCopy.BulkCopyTimeout = 5;
  bulkCopy.ColumnMappings.Add(mapping1);
  bulkCopy.ColumnMappings.Add(mapping2);
  bulkCopy.ColumnMappings.Add(mapping3);
  bulkCopy.ColumnMappings.Add(mapping4);
  bulkCopy.DestinationTableName = "tblOrder";
  bulkCopy.SqlRowsCopied +=
  new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
  bulkCopy.NotifyAfter = 200;
  bulkCopy.WriteToServer(table);
  }
  在bulkCopy_SqlRowsCopied的處理中,我只簡(jiǎn)單的通過(guò)展現(xiàn)給用戶一個(gè)友好的提示信息讓你可以知道目前有多少行被復(fù)制成功。代碼如下:     private void bulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
  {
  MessageBox.Show
  (String.Format("{0} Rows have been copied.", e.RowsCopied.ToString()));
  }
  這樣,在平時(shí)的開(kāi)發(fā)中,我們可以靈活的在ASP.NET中使用SqlBulkCopy幫助我們復(fù)制大量的數(shù)據(jù)之間的數(shù)據(jù)源和數(shù)據(jù)表,并改善應(yīng)用程序的性能。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服