代码之家  ›  专栏  ›  技术社区  ›  Kevin Doyon Zephaniah Grunschlag

为什么SqlCommand.ExecuteOnQuery引发的SqlException包含所有作为错误的打印?

  •  3
  • Kevin Doyon Zephaniah Grunschlag  · 技术社区  · 15 年前

    当我运行以下代码段时

    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 SqlError.Class 0(实际误差为18)

    但是,如果我替换 ExecuteNonQuery 具有 ExecuteScalar ,我得到了预期的结果:

    SQL_Error 我只有一个条目 例错误

    有什么办法可以避免这种奇怪的行为吗 cmd.ExecuteNonQuery ??

    2 回复  |  直到 15 年前
        1
  •  1
  •   Conrad Frix    15 年前

    不,你无法避免这种行为。这是TDSpaser.ThroweExceptionandWarning()编写方式的结果

    尤其是这一行

      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);
    

    我敢肯定,如果你到处闲逛,你可能会找到原因。

        2
  •  0
  •   madatanic    15 年前

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