2011-12-31 47 views
6

我有一個總是返回「PRINT」命令的SQL過程,我想提取這個「PRINT」命令的輸出,即C#中的過程,我該怎麼做?這裏是程序如何在C#中顯示SQL「PRINT」命令的輸出?

ALTER PROC ResultsPoll 
@pollid INT 
AS 
DECLARE @count1 INT 
DECLARE @count2 INT 
DECLARE @count3 INT 
DECLARE @count4 INT 
DECLARE @count5 INT 
DECLARE @test VARCHAR(MAX) 
DECLARE @value VARCHAR(MAX) 
SELECT @count1 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a1 
SELECT @count2 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a2 
SELECT @count3 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a3 
SELECT @count4 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a4 
SELECT @count5 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a5 

SELECT @test=Polls.a1 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count1 AS VARCHAR(MAX))) 
END 
SELECT @test=Polls.a2 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count2 AS VARCHAR(MAX))) 
END 
SELECT @test=Polls.a3 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count3 AS VARCHAR(MAX))) 
END 
SELECT @test=Polls.a4 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count4 AS VARCHAR(MAX))) 
END 
SELECT @test=Polls.a5 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count5 AS VARCHAR(MAX))) 
END 
+1

[捕獲存儲過程在.NET中的打印輸出]可能的重複(http://stackoverflow.com/questions/1880471/capture-stored-procedure-print-output-in-net) – dsolimano 2016-01-07 13:44:54

回答

17

您需要訂閱SqlConnection.InfoMessage事件。

MSDN有一些示例代碼here

+0

這將工作數據庫其他比sql服務器? – 2011-12-31 17:27:25

+0

@BrijeshMishra - 沒有'SqlConnection'特定於SQL Server。不知道其他RDBMS(Sybase除外)是否有與PRINT相同的內容... – 2011-12-31 17:29:04

3

正確的做法是將值記錄在輸出參數中,然後在存儲過程中打印輸出參數值。

例如:

ALTER PROC ResultsPoll 
@pollid INT , 
@message varchar(max) OUTPUT 
AS 
SET @message = '' 
... 
IF(@test IS NOT NULL) 
BEGIN 
SET @message = 'Number of students who chose '[email protected]+' is:'+' '+CAST (@count1 AS VARCHAR(MAX)) 
END 
... 

PRINT(@message) 

然後,在你的代碼,檢索輸出參數的值。

更新

如果是返回一個狀態或錯誤消息的上述建議只會工作。仔細查看存儲過程後,我意識到這個存儲過程並非如此,因爲print語句用於將數據返回給調用應用程序。

現在我明白了這一點,我建議,如果可能的話,如下的存儲過程被改寫:

ALTER PROC ResultsPoll 
@pollid INT 
AS 

SELECT result = 'Number of students who chose ' + MAX(Polls.a1) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a1 

UNION 

SELECT result = 'Number of students who chose ' + MAX(Polls.a2) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a2 

UNION 

SELECT result = 'Number of students who chose ' + MAX(Polls.a3) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a3 

UNION 

SELECT result = 'Number of students who chose ' + MAX(Polls.a4) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a4 

UNION 

SELECT result = 'Number of students who chose ' + MAX(Polls.a5) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a5 

有了這個,你可以只處理每一條記錄,這將有一個名爲一列結果。

+0

嗯,沒有看過他們爲什麼要這樣做。執行IMO的「正確」方法是返回一個帶有2列的簡單結果集'test,count' – 2011-12-31 17:26:29

+0

@MartinSmith:如果這種方法的查詢不會產生任何結果或者它們在未來將包括多個結果。我發現它包含狀態或錯誤信息,如參數中的「帶外」,這是更可靠和更具前瞻性的。 – 2011-12-31 17:31:01

+0

這些不是狀態消息。這是存儲過程返回的唯一數據。 – 2011-12-31 17:32:17

相關問題