【问题标题】:C# - SqlDataReader and serializationC# - SqlDataReader 和序列化
【发布时间】:2013-04-07 18:48:48
【问题描述】:

能否将 SqlDataReader 传递给会话或发送给客户端?

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

【问题讨论】:

    标签: c# sql serialization


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不,您必须将阅读器映射到 POCO,然后将其序列化。即使您可以在技术上序列化 SqlDatReader 对象,这也是一个非常糟糕的想法。不要这样做。使用微规则将查询映射到 DTO 很简单。不要让你的工作复杂化。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          这真的没有意义。您应该“物化”数据读取器并传递结果。

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

          【讨论】:

          • 如何将我的数据库查询结果传递给另一个客户端,然后将结果绑定到客户端的网格视图?
          • 您可以传递DataTable并将其设置为GridView.DataSource。然后只需调用 GridView.DataBind()
          猜你喜欢
          • 2010-10-29
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-06
          • 1970-01-01
          相关资源
          最近更新 更多