3

当我运行以下代码段时

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)

但是,如果我替换ExecuteNonQueryExecuteScalar,我会得到预期的结果:

消息是SQL_Error,我只有一个条目ex.Errors...

有什么办法可以避免cmd.ExecuteNonQuery??

4

2 回答 2

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 中的第一项

于 2010-02-03T05:47:32.210 回答
0

ExecuteNonQuery 通常返回一个记录集,而 ExecuteScalar 返回第一行 + 第一列。

于 2010-02-01T18:22:11.903 回答