2010-02-01 43 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

相关问题