2010-02-01 42 views
3

當我運行下面的代碼片斷爲什麼SqlCommand.ExecuteNonQuery引發的SqlException包含所有PRINT作爲錯誤?

try 
{ 
using (SqlConnection conn = new SqlConnection("I'm shy")) 
{ 
    conn.Open(); 

    using (SqlCommand cmd = conn.CreateCommand()) 
    { 
    cmd.CommandText = "PRINT 'A';PRINT 'B';PRINT 'C';RAISERROR('SQL_Error', 18, 1)"; 
    cmd.ExecuteNonQuery(); 
    } 
} 
} 
catch (SqlException ex) 
{ 
MessageBox.Show(ex.Message); 
} 

我得到以下信息:

SQL_Error 
A 
B 
C 

ex.Errors具有4個條目(3 SqlError的對應於打印具有0的SqlError.Class(VS 18爲真實錯誤)

但是,如果我用ExecuteScalar替換ExecuteNonQuery,我會得到預期的結果:

的信息是SQL_Error我只有在ex.Errors一個條目...

有沒有辦法避免的cmd.ExecuteNonQuery奇怪的行爲?

回答

1

不,你不能避免這種行爲。其方式TdsParser.ThrowExceptionAndWarning()的結果寫入

尤其這一行

bool breakConnection = this.AddSqlErrorToCollection(ref temp, ref this._errors) | this.AddSqlErrorToCollection(ref temp, ref this._attentionErrors); 
     breakConnection |= this.AddSqlErrorToCollection(ref temp, ref this._warnings); 
     breakConnection |= this.AddSqlErrorToCollection(ref temp, ref this._attentionWarnings); 

我的猜測是,無論出於何種原因收集_error或_attentionErrors之一爲空ExecuteScaler及其不是的ExecuteNonQuery 。

我敢肯定,如果你足夠周圍,你可能會找出原因。

無論如何,您似乎已經有了解決方法。僅使用SQLExecption.Error中的第一個項目

0

ExecuteNonQuery通常返回一個記錄集,而ExecuteScalar返回第一行+第一列。

+0

WExecuteNonQuery返回受影響的行數(類似於@@ ROWCOUNT),並且它有一些帶-1返回值的特權。 ExecuteReader返回一個SqlDataReader。儘管你對ExecuteScalar是正確的。 – Kevin 2010-02-01 20:40:21

+0

謝謝,我的意思是記錄集,而不是數據表 – madatanic 2010-02-01 20:47:01

相關問題