2013-04-15 2 views
2

Может ли SqlDataReader быть передан на сеанс или отправлен клиенту?C# - SqlDataReader и сериализация

Например, если я получил несколько строк из базы данных и хочу отправить эти данные на другой клиентский компьютер. Могу ли я просто сделать это, сериализуя его с помощью json на сервере и затем десериализовать обратно на клиент?

ответ

2

Нет, любой объект, связанный с ресурсом, не может быть передан клиенту.

Это не имело бы смысла. Вы должны «материализовать» устройство чтения данных и передать результаты.

I.e. вы можете создать SqlDataAdapter от своего читателя, заполнить DataTable и передать DataTable.

+0

Как может Я собираюсь передать результаты моего запроса к базе данных другому клиенту, а затем привязать результаты к виду сетки на стороне клиента? – Matthew

+0

Вы можете передать DataTable и установить его как GridView.DataSource. Затем просто вызовите GridView.DataBind() –

4

Нет, только данные (без методов или функций) могут быть сериализованы, поэтому считыватель данных будет бесполезен, поскольку вы не можете вызвать методы для продвижения читателя и т. Д. Шаблон должен состоять в том, чтобы прочитать все записи в списке объектов от читателя, закройте его, а затем сериализуйте эти объекты обратно клиенту.

2

Нет, вам нужно сопоставить читателя с POCO, который будет сериализован. Даже если вы можете технически сериализовать объект SqlDatReader, это идея ОЧЕНЬ ПЛОХО. Не делай этого. Тривиально использовать микроорганизм для сопоставления запроса с DTO. Не усложняйте свою работу.

0

Старый вопрос, но технологии предоставляют новые решения.

Вы можете использовать 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 
Смежные вопросы