-1

最好的方法是什么,通过 http 将 ADO.NETs ExecuteReader的结果发送到客户端(客户端当然会提取数据)。

我不想将结果加载到List<Dictionary<string, object>>序列化中等等,因为这似乎会产生很多开销。

有没有一种方法可以通过 http 以二进制格式发送数据?

谢谢!

4

1 回答 1

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给客户端,由最少的原始成员组成,它应该有最小的开销。

于 2015-02-16T07:28:15.790 回答