代码之家  ›  专栏  ›  技术社区  ›  BendEg

通过http发送ExecuteReader结果的最佳方式

  •  -1
  • BendEg  · 技术社区  · 9 年前

    发送ADO.NET结果的最佳方式是什么 ExecuteReader 通过http发送到客户端(客户端当然会提取数据)。

    我不想将结果加载到 List<Dictionary<string, object>> 将其序列化等等,因为这似乎会产生很大的偏差。

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

    非常感谢。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Shadow Wizard    9 年前

    我认为最好的方法是用表字段作为类成员构建一个自定义类,然后将每一行作为一个新实例发送普通数组:

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