如何使用SqlConnection/SqlDataReader的客户端游标?

问题描述 投票:0回答:3

我有一个 SQL Server 2014 实例和一个用 C# 编写的客户端应用程序。

从这个应用程序中,我使用下面的代码检索数据。通过一些经验测试,似乎正在使用“服务器端游标”。对于我的特定用例,我想使用客户端游标。这怎么办? 如何让我的连接使用客户端游标?

<connectionStrings> <clear/> <add name="myDB" connectionString="Server=SERVER\INSTANCE;Database=test" providerName="System.Data.SqlClient" /> </connectionStrings>

C# 客户端代码:

using (var connection = OpenConnection()) { using (var command = connection.CreateCommand()) { command.CommandType = CommandType.StoredProcedure; command.CommandText = "dbo.my_stored_procedure"; using (var reader = command.ExecuteReader()) { while (reader.Read()) { object retrievedObject = reader.GetValue(0); // Use object... } } } }

有用的链接:

    客户端游标与服务器端游标
  • 游标类型(SQLSRV 驱动程序)
c# sql-server sql-server-2014
3个回答
6
投票
CursorLocationEnum

,它允许用户选择是否应使用客户端游标或服务器端游标。 ADO.NET 以不同的方式工作。 ADO.NET Datareader 相当于服务器端游标,它不能用作客户端游标。


我对客户端游标的理解是,它是在所有数据首先下载到客户端然后进行处理时使用的。这意味着在初始获取数据后,不会向服务器发送任何其他请求。如果我是对的,这意味着 ADO.NET DataSet 相当于 ADO.NET 中的客户端游标。它是一个可以用 DataAdapter 填充的离线/断开连接的数据结构。这篇

文章

也很有用。


3
投票

DataTable dt = new DataTable(); dt.Load(reader); foreach (var row in dt.Rows) { /* Your data is in row now */}



0
投票
DataAdapter

将数据加载到 DataSet 并且

DataSet

为您提供标准 IDataReader

public static IDataReader ExecuteReaderClient(SqlConnection connection, DbTransaction? transaction, String commandText)
{
    DbCommand command = connection.CreateCommand();
    command.CommandText = commandText;
    if (transaction != null)
        command.Transaction = transaction;

    // Use an adapter to run the query
    DbDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = command;

    // Ask the adapter to dump the results into a dataset
    using (DataSet dataset = new DataSet());
    adapter.Fill(dataset);

    // Return the dataset as an IDataReader
    return dataset.CreateDataReader();
}

© www.soinside.com 2019 - 2024. All rights reserved.