2013-04-17 26 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(或任何大小由“分组大小”连接字符串关键字设置)字节,其存储从服务器中读取最新的网络数据包阵列。这是处理网络数据的应用程序的标准做法 - 将网络中的数据块复制到本地缓冲区,解析该数据,然后获取下一个块。

从哪里读取数据?从数据库或从缓存?

读()从网络缓冲器,直到有留在缓冲器中没有更多的数据处理数据时,将读取从网络的下一个分组到缓冲器,并继续处理这一点。