我通过从多个表中收集数据来重新水化我的业务对象,例如,
SELECT * FROM CaDataTable; SELECT * FROM NyDataTable; SELECT * FROM WaDataTable;
依旧...... (C#3.5,SQL Server 2005)
我一直在使用批次:
void BatchReader()
{
string sql = "Select * From CaDataTable" +
"Select * From NyDataTable" +
"Select * From WaDataTable";
string connectionString = GetConnectionString();
using (SqlConnection conn = new SqlConnection(connectionString)) {
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
using (SqlDataReader reader = cmd.ExecuteReader()) {
do {
while (reader.Read()) {
ReadRecords(reader);
}
} while (reader.NextResult());
}
}
}
我还对同一个连接使用了多个命令:
void MultipleCommandReader()
{
string connectionString = GetConnectionString();
string sql;
SqlCommand cmd;
using (SqlConnection conn = new SqlConnection(connectionString)) {
conn.Open();
sql = "Select * From CaDataTable";
cmd = new SqlCommand(sql, conn);
using (SqlDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
ReadRecords(reader);
}
}
sql = "Select * From NyDataTable";
cmd = new SqlCommand(sql, conn);
using (SqlDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
ReadRecords(reader);
}
}
sql = "Select * From WaDataTable";
cmd = new SqlCommand(sql, conn);
using (SqlDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
ReadRecords(reader);
}
}
}
}
这些技术中的一种明显优于其他技术吗? 另外,如果我在第二种方法上使用MARS,会有收获吗?换句话说,就像在连接字符串中设置MultipleActiveResultSets = True并获得巨大收益一样简单吗?
答案 0 :(得分:2)
如果每个表中的数据结构相同,我会这样做:
Select *, 'Ca' Source From CaDataTable
union all
Select *, 'Ny' Source From NyDataTable
union all
Select *, 'Wa' Source From WaDataTable
答案 1 :(得分:0)
如果没有实际对两个版本进行计时,你只能推测......
我希望打赌版本1(BatchReader)会更快,因为你只能获得一次数据库往返。版本2需要三次不同的往返 - 每次执行的查询各一次。
但是又一次:你只能真的告诉你是否测量。
马克
哦,PS:当然在现实生活中,它也有助于限制返回的列,例如:不要使用SELECT *
,而是使用SELECT (list of fields)
并尽可能缩短字段列表。