MARS vs NextResult

时间:2009-06-17 18:41:11

标签: ado.net mars

我通过从多个表中收集数据来重新水化我的业务对象,例如,

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并获得巨大收益一样简单吗?

2 个答案:

答案 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)并尽可能缩短字段列表。