2015-02-16 3 views
-1

Каков наилучший способ отправки результата ADO.NET ExecuteReader через http-клиент (клиент, конечно, извлекает данные).Лучший способ отправки результата ExecuteReader по http

Я не хочу загружать результат в серию сериализации List<Dictionary<string, object>> и т. Д., Потому что это, похоже, создает много над головой.

Есть ли способ отправки данных в виде двоичного формата по http?

Спасибо!

+0

Вы можете использовать BinaryFormatter (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter(v=vs.110).aspx) для сериализации списка или DataTable в двоичном формате. –

+0

Я посмотрю на BinaryFormatter. Но есть ли способ пойти без сериализации? – BendEg

+0

Другим вариантом является просто позволить клиенту выполнять запросы непосредственно против базы данных. –

ответ

1

Лучший способ, на мой взгляд строит пользовательский класс с полями таблицы в качестве членов класса, а затем отправить простой массив с каждой строки в качестве нового экземпляра:

public class Car 
{ 
    public string Model { get; set; } 
    public int Price { get; set; } 
} 

public void Foo() 
{ 
    string strSQL = "Select * From Cars"; 

    List<Car> cars = new List<Car>(); 
    //...initialize connection, Command, etc... 
    while (reader.Read()) 
    { 
     cars.Add(new Car { 
      Model = reader["Model"] + "", 
      Price = (int)reader["Price"] 
     }); 
    } 
    //...send cars.ToArray() over to client... 
} 

Таким образом, вы посылаете только данные, необходимые , с нулевыми накладными расходами.

Если вы хотите сделать его гибким и поддерживать любую структуру таблицы, вам понадобится еще несколько классов. Самое основное, что я могу думать, это такие классы:

public class BasicField 
{ 
    public string Name { get; set; } 
    public object Value { get; set; } 
} 

public class BasicRow 
{ 
    public BasicField[] Fields { get; set; } 
} 

public class BasicTable 
{ 
    public BasicRow[] Rows { get; set; } 

    public static BasicTable Parse(DataTable table) 
    { 
     string[] fieldNames = table.Columns.OfType<DataColumn>().ToList().ConvertAll(c => c.Caption).ToArray(); 
     List<BasicRow> basicRows = table.Rows.OfType<DataRow>().ToList().ConvertAll(dataRow => 
     { 
      List<BasicField> fields = new List<BasicField>(); 
      for (int i = 0; i < dataRow.ItemArray.Length; i++) 
       fields.Add(new BasicField 
       { 
        Name = fieldNames[i], 
        Value = dataRow.ItemArray[i] 
       }); 
      return new BasicRow 
      { 
       Fields = fields.ToArray() 
      }; 
     }); 
     return new BasicTable 
     { 
      Rows = basicRows.ToArray() 
     }; 
    } 
} 

Затем, чтобы использовать его, требуется такой код:

BasicTable basicTable; 
string strSQL = "Select * From Cars"; 
using (DataTable table = new DataTable()) 
{ 
    using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, connection)) 
    { 
     adapter.Fill(table); 
    } 
    basicTable = BasicTable.Parse(table); 
} 

И вы можете отправить basicTable к клиенту, сделавшись от минимального примитивных членов, он должен иметь минимальные накладные расходы.

+0

Проблема в том, что у меня нет модели, потому что SQL очень динамичен. – BendEg

+0

@BendEg Вы имеете в виду, что вам нужно что-то отправить? Никаких ограничений вообще? –

+0

Да, это правильно. Все, что можно вернуть из db - так что угодно :) Но в некоторых случаях у меня есть, например, 20000 строк с 20 столбцами, поэтому я хочу получить как можно больше производительности. – BendEg

Смежные вопросы