2014-06-23 45 views
1

我已經提供了一個存儲過程,需要在SSMS中運行並選擇「結果到文本」,以便結果和消息以正確順序顯示。從SQL中返回結果和消息在C#winform中存儲過程

的原因是,在存儲過程被用來建立一個腳本從一個數據庫轉移客戶設置到另一個,打印語句用來包裝信息消息和錯誤周圍插入語句處理...

PRINT「將值插入到[AIP_M_SITE_LABELS]」

INSERT INTO [AIP_M_DEV_SITE_LABELS] VALUES(2,90014, '舞臺指標 - 總計個階段',0, '的',0,0)

INSERT INTO [AIP_M_DEV_SITE_LABELS] VALUES(2,90025,'Ledger _ Ref',0,'N/A',0,0)

IF @@ ERROR <> 0

BEGIN

打印( '錯誤插入到[AIP_M_SITE_LABELS]')

GOTO ExecutionFail

END

有一種方法來在我的C#winform中執行這個存儲過程,這將允許我保存這個輸出?到目前爲止,我已經設法分別獲取結果集和消息,但尚未「合併」並按正確的順序。

回答

2

您需要訂閱您的SQLConnection對象的InfoMessage事件。像這樣的東西應該工作:

類級別定義這讓你的事件處理程序可以訪問它:

StringBuilder sb = new StringBuilder(""); 

無論位於何處,您的SQL的東西:

  var conn = new SqlConnection("your connection string"); 
     conn.Open(); 
     conn.InfoMessage += conn_InfoMessage; 
     var commandText = "your SP name"; 
     var command = new SqlCommand(commandText, conn) {CommandType = CommandType.StoredProcedure}; 
     command.ExecuteNonQuery(); 

的事件處理程序來抓取數據(不需要是靜態的,但我的是):

編輯
剛剛看到關於以1張爲單位獲得印刷和工作結果的說明。而不是使用.ExecuteNonQuery(),使用.ExecuteReader()並使用正常的SQLDataReader。您的InfoMessage事件仍然會觸發,並且您需要手動合併方法中某處SQLDataReader和InfoMessage事件的結果。請注意追加到您的課程級別的字符串構建器,並在導致該事件觸發的方法中使用它。

+0

感謝您的回覆 - 正如您所建議的,我已經在使用Infomessage事件來捕捉郵件,這是兩者合併的結果,這就是我的! – RobinPilch

+0

它正在工作 - 將SQLDataReader和Info消息處理程序的輸出合併到字符串生成器中,只返回我正在查找的內容。感謝您的建議! – RobinPilch