繁体   English   中英

C# - SqlDataReader和序列化

[英]C# - SqlDataReader and serialization

可以将SqlDataReader传递给会话或发送到客户端吗?

例如,如果我从数据库中检索了一些行,并希望将此数据发送到另一台客户端计算机。 我可以通过在服务器上使用json序列化然后在客户端上反序列化来执行此操作吗?

不,只有数据(没有方法或功能)可以被序列化,所以数据阅读器将是无用的,因为你无法调用方法来推进阅读器等。模式是将所有记录读入一个对象列表中阅读器,关闭它,然后将这些对象序列化回客户端。

不,任何与资源相关的对象都不能“传递”到客户端。

这没有多大意义。 您应该“实现”数据读取器并传递结果。

即,您可以从阅读器创建SqlDataAdapter,填充DataTable并传递DataTable。

不,您必须将阅读器映射到POCO并且将被序列化。 即使你可以在技术上序列化SqlDatReader对象,它也是一个非常糟糕的想法。 不要这样做。 使用微观orm将查询映射到DTO是微不足道的。 不要使你的工作复杂化。

旧问题,但技术提供了新的解决方案。

您可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM