【发布时间】:2013-04-07 18:48:48
【问题描述】:
能否将 SqlDataReader 传递给会话或发送给客户端?
例如,如果我从数据库中检索了一些行,并希望将这些数据发送到另一台客户端计算机。我可以通过在服务器上使用 json 序列化它然后在客户端反序列化来简单地做到这一点吗?
【问题讨论】:
标签: c# sql serialization
能否将 SqlDataReader 传递给会话或发送给客户端?
例如,如果我从数据库中检索了一些行,并希望将这些数据发送到另一台客户端计算机。我可以通过在服务器上使用 json 序列化它然后在客户端反序列化来简单地做到这一点吗?
【问题讨论】:
标签: c# sql serialization
老问题,但技术提供了新的解决方案。
您可以使用Protocol Buffers DataReader Extensions for .NET 来序列化SqlDataReader,并且可以传递给会话或发送给客户端
例子:
string connstring1 = "Data Source=server1;Initial Catalog=northwind;user=xxx;password=xxx";
//Serializing an IDataReader into a ProtoBuf:
Stream buffer = new MemoryStream();
using (var c1 = new SqlConnection(connstring1))
{
c1.Open();
// Serialize SQL results to a buffer
using (var command = new SqlCommand("SELECT * FROM products", c1))
using (var reader = command.ExecuteReader())
DataSerializer.Serialize(buffer, reader);
// Read them back
buffer.Seek(0, SeekOrigin.Begin);
using (var reader = DataSerializer.Deserialize(buffer))
{
while (reader.Read())
{
Console.WriteLine(reader["ProductName"]);
}
}
}
}
你应该安装 nuget 包:
Install-Package protobuf-net-data
【讨论】:
不,您必须将阅读器映射到 POCO,然后将其序列化。即使您可以在技术上序列化 SqlDatReader 对象,这也是一个非常糟糕的想法。不要这样做。使用微规则将查询映射到 DTO 很简单。不要让你的工作复杂化。
【讨论】:
不,只能序列化数据(没有方法或功能),因此数据读取器将无用,因为您无法调用方法来推进读取器等。模式是将所有记录读入列表来自阅读器的对象,关闭它,然后将这些对象序列化回客户端。
【讨论】:
不,任何与资源相关的对象都不能“传递”给客户端。
这真的没有意义。您应该“物化”数据读取器并传递结果。
即您可以从您的阅读器创建一个 SqlDataAdapter,填充一个 DataTable 并传递 DataTable。
【讨论】: