2013-04-17 23 views
3

我是ADO.net的新手 我需要從DB中檢索一組行,然後迭代one-be-one並有條件地發送它們對於某些可能從UPDATEDELETE收到DB的對象。 從SqlDataReader文件我沒有正確理解它是如何工作(它從數據庫讀取所有的行或只有一些或者一個接一個?) 從MSDN選擇一組行並更新或刪除一些:SqlDataReader或SqlDataAdapter + DataSet

結果返回查詢執行並存儲在客戶端的網絡緩衝區中的 ,直到您使用DataReader的Read 方法請求它們。

  • 當確切的結果返回? command.ExecuteReader()期間或reader.Read()期間?結果的內容是什麼 - 所有數據或部分數據?
  • 什麼是本地機器上的「網絡緩衝區」?
  • 從哪裏讀取數據Read?從數據庫或從緩存?

會影響數據修改(UPDATEDELETE)從數據庫中檢索下一個數據嗎? 代碼存根:

using (SqlConnection connection = new SqlConnection(connectionString)) 
using (SqlCommand command = new SqlCommand(queryString, connection)) 
{ 
    connection.Open(); 
    using (SqlDataReader reader = command.ExecuteReader()); 
    { 
    while (reader.Read()) 
     { 
      //ReadSingleRow... 
     //Perform some checks and if TRUE send to a manager obeject whcih perform UPDATE or DELETE on this record 
     } 
    } 
} 

或者最好使用SqlDataAdapterDataSetDataTable這裏?

+0

當您執行代碼時,您是否嘗試過使用SSMS的活動監視器,您將看到將什麼SQL發送到服務器。 – Irfarino

+0

仍然沒有,但我會做到這一點。但我的問題是更多的理論 - 我想了解它具體如何工作,因爲解決方法始終會被發現 – ALZ

+0

請忽略早先的評論,它超時了我。您是否嘗試過調試代碼並在SSMS中使用Activity監視器來查看正在執行的SQL以及何時嘗試單步執行代碼,您將看到發生了什麼。要回答你的第一點,command.executereader()方法將把命令提交給服務器。結果存儲在客戶端PC上看看這個鏈接[ADO.NET](http://msdn.microsoft.com/en-ca/library/haa3afyz(v = vs.71).aspx)。看看這本書,從Aress的C#5.0數據庫開始,ADO.NET編程的優秀資源。 – Irfarino

回答

0

對於您所描述的內容,最好使用SqlDataAdapter和DataTable--它們被設計爲服務器數據的「脫機緩存」,它將跟蹤所做的任何更改,並且可以在SqlDataAdapter時更新服務器的副本。 Update()被調用。

SqlDataReader被設計爲來自服務器的只進只讀數據流 - 您必須構建自己的邏輯來更新服務器。

爲了回答您的其他問題:

當到底是返回的結果?

ExecuteReader()完成時返回結果。根據您的看法,這些結果可能是部分結果或完整結果 - 服務器已完成執行查詢並將所有結果發送給客戶端,但客戶端一次只處理一個數據包的結果。

什麼是本地機器上的「網絡緩衝區」?

「網絡緩衝器」,該MSDN在談論是指一個8KB(或任何大小由「分組大小」連接字符串關鍵字設置)字節,其存儲從服務器中讀取最新的網絡數據包陣列。這是處理網絡數據的應用程序的標準做法 - 將網絡中的數據塊複製到本地緩衝區,解析該數據,然後獲取下一個塊。

從哪裏讀取數據?從數據庫或從緩存?

讀()從網絡緩衝器,直到有留在緩衝器中沒有更多的數據處理數據時,將讀取從網絡的下一個分組到緩衝器,並繼續處理這一點。