当前位置: 首页 > 面试题库 >

为什么SqlCommand.ExecuteNonQuery抛出的SqlException包含所有PRINT作为错误?

柴飞扬
2023-03-14
问题内容

当我运行以下代码片段时

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)

但是,如果我替换ExecuteNonQuery为,则会ExecuteScalar得到预期的结果:

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

有什么办法可以避免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中的第一项



 类似资料:
  • 我得到而调用 Java语言lang.StackOverflowerr:org处为null。阿帕奇。平民登录中。日志适配器$Slf4jLog。isDebugEnabled(LogAdapter.java:300)~[spring-jcl-5.1.10.RELEASE.jar:5.1.10.RELEASE]位于org。springframework。安全身份验证。ProviderManager。在or

  • 本文向大家介绍为什么JavaScript的“ var null”抛出错误而“ var undefined”没有抛出错误?,包括了为什么JavaScript的“ var null”抛出错误而“ var undefined”没有抛出错误?的使用技巧和注意事项,需要的朋友参考一下 Web浏览器会抛出“ var null”错误,因为它是保留的标识符。 您不能在ECMAScript中使用以下文字作为标识符-

  • 正如标题所说。正确呈现所有的unicode格式,包括复合字符和影响其他字符和连字的字符,这真的很难,我理解这一点。我们的字体似乎是为最大限度地支持Unicode符号而设计的(Symbola、Code2001等),以及特定平面或字符范围的专用字体(BabelStone Han等)。 我不太了解字体的底层技术细节。有最大尺寸吗?是版权问题吗?重画所有现存的大约110,000个符号是不是太难了?我理解对

  • 问题内容: final Multimap terms = getTerms(bq); for (Term t : terms.keySet()) { Collection C = new HashSet(terms.get(t)); if (!C.isEmpty()) { for (Iterator it = C.iterator(); it.hasNext();) { BooleanClause

  • 问题内容: 我试图将两个’Employee’对象添加到TreeSet中: 但是它抛出一个ClassCastException: 但是,如果我仅将一个对象添加到TreeSet中: 或者,如果我改用HashSet: 那就成功了。为什么会发生异常,我该如何解决? 问题答案: 要么必须实现,或者你需要提供一个比较创建时。 在文档中对此进行了详细说明: 插入排序集中的所有元素都必须实现接口(或被指定的比较器

  • 问题内容: 将字符串解析为字节时出现异常 问题答案: 这是因为默认的parse方法要求使用十进制格式的数字来解析十六进制数字,请使用以下parse: 其中16是解析的基础。 至于您的评论,您是对的。字节的最大值为0x7F。因此,您可以将其解析为并执行二进制与操作以获得LSB,即您的字节: