SqlConnection/SqlDataReader 如何使用客户端游标?
How to use client-side cursor for SqlConnection/SqlDataReader?
我有一个 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...
}
}
}
}
有用的链接:
在旧的 ADO 中有 CursorLocationEnum
允许一个 select 如果应该使用客户端或服务器端游标。 ADO.NET 以不同的方式工作。 ADO.NET Datareader 相当于服务器端游标,不能用作客户端游标。
我对客户端游标的理解是,当所有数据首先下载到客户端然后进行处理时使用它。这意味着在初始获取数据后,不会向服务器发送其他请求。如果我是对的,这意味着 ADO.NET DataSet 相当于 ADO.NET 中的客户端游标。它是一个 offline/disconnected 数据结构,可以用 DataAdapter 填充。这个article也很有用。
假设 "client-side cursor" 您的意思是您希望立即将所有结果传输到客户端,而不是在服务器执行时逐步从服务器读取,只需将其加载到数据表中即可。
DataTable dt = new DataTable();
dt.Load(reader);
foreach (var row in dt.Rows) { /* Your data is in row now */}
我有一个 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...
}
}
}
}
有用的链接:
在旧的 ADO 中有 CursorLocationEnum
允许一个 select 如果应该使用客户端或服务器端游标。 ADO.NET 以不同的方式工作。 ADO.NET Datareader 相当于服务器端游标,不能用作客户端游标。
我对客户端游标的理解是,当所有数据首先下载到客户端然后进行处理时使用它。这意味着在初始获取数据后,不会向服务器发送其他请求。如果我是对的,这意味着 ADO.NET DataSet 相当于 ADO.NET 中的客户端游标。它是一个 offline/disconnected 数据结构,可以用 DataAdapter 填充。这个article也很有用。
假设 "client-side cursor" 您的意思是您希望立即将所有结果传输到客户端,而不是在服务器执行时逐步从服务器读取,只需将其加载到数据表中即可。
DataTable dt = new DataTable();
dt.Load(reader);
foreach (var row in dt.Rows) { /* Your data is in row now */}