当我运行以下代码片段时
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个条目(SqlError与打印相对应的3的aSqlError.Class为0(实际错误为18)
ex.Errors
SqlError
SqlError.Class
但是,如果我替换ExecuteNonQuery为,则会ExecuteScalar得到预期的结果:
ExecuteNonQuery
ExecuteScalar
消息是SQL_Error,我在ex.Errors…中只有一个条目
SQL_Error
有什么办法可以避免cmd.ExecuteNonQuery??的奇怪行为?
cmd.ExecuteNonQuery
不,您无法避免这种行为。它是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);
我的猜测是,无论出于何种原因,对于ExecuteScaler而言,集合_error或_attentionErrors之一为空,而对于ExecuteNonQuery而言则为空。
我敢肯定,如果您戳了一下就可以找出原因。
无论如何,您似乎已经有了解决方法。仅使用SQLExecption.Error中的第一项