通过 http 发送 ExecuteReader 结果的最佳方式
Best way sending ExecuteReader result over http
最好的方法是什么,通过 http 将 ADO.NETs ExecuteReader 的结果发送到客户端(客户端当然会拉取数据)。
我不想将结果加载到 List<Dictionary<string, object>>
序列化它等等,因为这似乎会产生很多开销。
有没有一种方法可以通过 http 以二进制格式发送数据?
谢谢!
我认为最好的方法是构建自定义 class,将 table 字段作为 class 成员,然后将每一行作为新实例发送普通数组:
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...
}
通过这种方式,您只发送需要的数据,开销为零。
如果你想让它更灵活并支持任何 table 结构,你将需要更多 classes。我能想到的最基本的事情是 classes:
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
发送给客户端,由最少的原始成员组成,它应该具有最小的开销。
最好的方法是什么,通过 http 将 ADO.NETs ExecuteReader 的结果发送到客户端(客户端当然会拉取数据)。
我不想将结果加载到 List<Dictionary<string, object>>
序列化它等等,因为这似乎会产生很多开销。
有没有一种方法可以通过 http 以二进制格式发送数据?
谢谢!
我认为最好的方法是构建自定义 class,将 table 字段作为 class 成员,然后将每一行作为新实例发送普通数组:
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...
}
通过这种方式,您只发送需要的数据,开销为零。
如果你想让它更灵活并支持任何 table 结构,你将需要更多 classes。我能想到的最基本的事情是 classes:
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
发送给客户端,由最少的原始成员组成,它应该具有最小的开销。