【问题标题】:Select a set of rows and UPDATE or REMOVE some: SqlDataReader or SqlDataAdapter+DataSet选择一组行并更新或删除一些:SqlDataReader 或 SqlDataAdapter+DataSet
【发布时间】:2013-04-17 16:46:55
【问题描述】:

我是 ADO.net 的新手 我需要从 DB 中检索一组行,然后逐一迭代并有条件地将它们发送到一些对象,这些对象可能从 DB 接收到行 UPDATEDELETE。 从SqlDataReader 文档中我没有正确理解它是如何工作的(它是从数据库中读取所有行还是只读取其中一些行或一个接一个?) 来自MSDN

结果在查询执行时返回,并存储在 客户端上的网络缓冲区,直到您使用 Read 请求它们 DataReader 的方法。

  • 究竟何时返回结果?在command.ExecuteReader() 期间还是在reader.Read() 期间? Result 的内容是什么 - 所有数据还是部分数据?
  • 什么是本地计算机上的“网络缓冲区”?
  • 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

【问题讨论】:

  • 您是否尝试过 SSMS 中的活动监视器,当您执行代码时,您会看到发送到服务器的 SQL。
  • 还是不行,但我会做的。但我的问题更具理论性 - 我想了解它的具体工作原理,因为总会找到解决方法
  • 请忽略之前对我超时的评论。您是否尝试过调试代码并在 SSMS 中使用活动监视器来查看正在执行的 SQL 以及何时执行,尝试单步执行代码,您将确切看到发生了什么。为了回答您的第一点,command.executereader() 方法会将命令提交到服务器。结果存储在客户端PC上看看这个链接ADO.NET。看看这本书,从 APress 开始 C# 5.0 数据库,ADO.NET 编程的优秀资源。

标签: c# sql-server ado.net sqldatareader sqldataadapter


【解决方案1】:

对于您所描述的,最好使用 SqlDataAdapter 和 DataTable - 它们被设计为服务器数据的“离线缓存”,它将跟踪所做的任何更改并可以在 SqlDataAdapter.Update 时更新服务器的副本() 被调用。

SqlDataReader 被设计为来自服务器的只进、只读数据流 - 您必须构建自己的逻辑来更新服务器。

回答您的其他问题:

具体什么时候返回结果?

当 ExecuteReader() 完成时返回结果。根据您的看法,这些是部分结果或完整结果 - 服务器已完全执行查询并将所有结果发送给客户端,但客户端一次只处理一个数据包。

什么是本地机器上的“网络缓冲区”?

MSDN 所说的“网络缓冲区”是指一个 8Kb(或由“数据包大小”连接字符串关键字设置的任何大小)字节数组,用于存储从服务器读取的最新网络数据包。这是处理网络数据的应用程序的标准做法 - 您将网络数据块复制到本地缓冲区,解析该数据,然后获取下一个块。

Read 从哪里读取数据?来自数据库还是来自缓存?

Read() 处理来自网络缓冲区的数据,直到缓冲区中没有更多数据为止,然后它将从网络中读取下一个数据包到缓冲区中,并继续处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多