我正在研究SQL服务器监控项目。在这里我想从机器上安装的所有SQL Server实例中获取数据。为此,我编写了一个CLR存储过程,其中数据来自两个不同的SqlDataReader对象,我想合并这两个datareder对象。
是否可以合并两个SQLdatareader对象?
以下是我遇到此问题的情况:
SqlConnection conn = new SqlConnection("ConnectionSting of 1st SQLServerInstance")
string query = "select dbid,uid,cpu from [master].[sys].sysprocesses";
SqlCommand SelectCmmand = new SqlCommand(query, conn);
SqlDataReader rd1;
conn.Open();
rd1 = SelectCmmand.ExecuteReader();
conn.Close();
conn = new SqlConnection("ConnectionSting of 2nd SQLServerInstance")
SqlCommand SelectCmmand = new SqlCommand(query, conn);
SqlDataReader rd2;
conn.Open();
rd2 = SelectCmmand.ExecuteReader();
conn.Close();
SqlPipe sp;
sp = SqlContext.Pipe;
sp.Send(?????);
现在,sp.Send(??)方法希望SQLDataReader对象作为参数,我想从两个不同的连接字符串中发送上述数据。
那么,我应该如何合并/组合rd1和rd2?
答案 0 :(得分:3)
您可以使用阅读器加载两个DataTable,合并它们并调用DataTable.CreateDataReader()
。
例如(未经测试):
DataTable dt1 = New DataTable();
dt1.Load(rd1);
DataTable dt2 = New DataTable();
dt2.Load(rd2);
dt1.Merge(dt2);
DataTableReader mainReader = dt1.CreateDataReader();
Common.DbDataReader reader = (Common.DbDataReader)mainReader;
sp.Send((SqlClient.SqlDataReader)reader);
修改:我担心我的代码无效,因为您无法将DbDataReader
强制转换为SqlDataReader
。
使用SqlPipe.SendResultsRow逐行发送所有记录的方法(再次,未经测试)。
答案 1 :(得分:2)
您无法合并SqlDataReaders。
您是否考虑过只返回两个结果集?就好像你在同一个批处理或存储过程中执行了SELECT * FROM Table1,然后是SELECT * FROM Table2。在客户端,使用SqlDataReader.NextResult()从第一个结果集前进到第二个结果集。
答案 2 :(得分:1)
首先将datareader转换为数据表
SqlCommand SelectCmmand = new SqlCommand(query, conn);
SqlDataReader rd1;
conn.Open();
rd1 = SelectCmmand.ExecuteReader();
DataTable dt1 = new DataTable();
dt1.Load(rd1);
conn.Close();
SqlCommand SelectCmmand = new SqlCommand(query, conn);
SqlDataReader rd2;
conn.Open();
rd2 = SelectCmmand.ExecuteReader();
DataTable dt2 = new DataTable();
dt2.Load(rd2);
conn.Close();
然后合并它们
dt1.Merge(dt2);
请注意,表2中的数据将添加到表1
现在转换回数据阅读器
DataTableReader dtr;
dtr = dt1.CreateDataReader();
SqlPipe sp;
sp = SqlContext.Pipe;
sp.Send(dtr);