2011-12-01 55 views
4

我正在處理SQL服務器監視項目。在這我想從機器上安裝的所有SQL Server實例中獲取數據。爲此,我編寫了一個CLR存儲過程,其中數據來自兩個不同的SqlDataReader對象,我想合併這兩個數據對象。如何合併/合併兩個SqlDataReader對象

是否可以合併兩個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對象作爲參數,我想送兩個不同獲取上述數據ConnectionString的。

那麼,我應該如何合併/組合rd1和rd2?

回答

3

您可以將兩個DataTables加載到閱讀器中,合併它們並呼叫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); 

編輯:我怕我的代碼不起作用,因爲你不能施放DbDataReaderSqlDataReader

一種方法是(再次未經測試)使用SqlPipe.SendResultsRow逐行發送所有記錄。

+0

像這樣SqlContext.Pipe.SendResultsRow(); –

+0

是的,我們可以逐行發送,但這會影響性能....感謝您的回覆 – Darshan

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); 
+0

[發送方法](http://msdn.microsoft.com/zh-cn/library/ms127317.aspx)需要一個SqlDataReader而不是DataTableReader。這不會像我的答案。 –

+0

@TimSchmelter好吧,感謝您的信息 –

2

您不能合併SqlDataReaders。

你是否考慮過只返回兩個結果集?這就好像您在同一個批處理或存儲過程中執行了SELECT * FROM Table1,然後是SELECT * FROM Table2。在客戶端,使用SqlDataReader.NextResult()從第一個結果集前進到第二個結果集。

+0

其實這也不會爲我的情況工作,我想從兩個不同的SQL Server中獲取數據,所以連接字符串是兩個查詢不同。如果我按照你的建議使用它,那麼它將在單個數據庫上激發。 – Darshan

+0

我以爲你從兩個實例中獲取數據,並從一個CLR SP中返回。所以客戶端只有一個連接字符串,只發出一個查詢,對吧?那麼,爲什麼CLR SP無法返回兩個結果集來響應該查詢? – RickNZ