【问题标题】:SQL Try Catch for specific severity onlySQL Try Catch 仅针对特定严重性
【发布时间】:2013-09-29 16:06:32
【问题描述】:

您好,我有一个很长的 SQL 脚本,它作为单个事务运行以从文件中批量导入。

在运行脚本时,我发现我收到了一些信息性消息、一些警告和一些错误,这些错误会立即停止脚本的运行 - 但是它不会回滚事务。

为了解决这个问题,我使用了一个 try-catch 块,如果有任何错误,它现在可以成功回滚事务;但是,我的信息和警告也会触发 catch 块并在需要完成时停止我的脚本。

有没有办法只跳到关键错误的捕获处,对于警告和信息消息,我只想测试 @@error 并将其插入到字符串中,然后在最后将这些全部输出给用户。

【问题讨论】:

    标签: sql-server stored-procedures try-catch


    【解决方案1】:

    你在使用 RaiseError 事件吗?

    严重级别 0-9 应用于信息级别消息。

    更多信息

    RaiseError

    Database Engine Severity Levels

    【讨论】:

      【解决方案2】:

      试试这个,希望能给你解决办法

      字符串 cnnString =WebConfigurationManager.ConnectionStrings["MyString"].ConnectionString; SqlConnection cnn = new SqlConnection(cnnString); SqlTransaction 事务;

      cnn.Open();
      transaction = cnn.BeginTransaction();
      
      try
      {
      
          // Command Objects for the transaction
          SqlCommand cmd1 = new SqlCommand("sproc1", cnn);
          SqlCommand cmd2 = new SqlCommand("sproc2", cnn);
      
          cmd1.CommandType = CommandType.StoredProcedure;
          cmd2.CommandType = CommandType.StoredProcedure;
      
          cmd1.Parameters.Add(new SqlParameter("@Param1", SqlDbType.NVarChar, 50));
          cmd1.Parameters["@Param1"].Value = paramValue1;
      
          cmd1.Parameters.Add(new SqlParameter("@Param2", SqlDbType.NVarChar, 50));
          cmd1.Parameters["@Param2"].Value = paramValue2;
      
          cmd2.Parameters.Add(new SqlParameter("@Param3", SqlDbType.NVarChar, 50));
          cmd2.Parameters["@Param3"].Value = paramValue3;
      
          cmd2.Parameters.Add(new SqlParameter("@Param4", SqlDbType.NVarChar, 50));
          cmd2.Parameters["@Param4"].Value = paramValue4;
      

      cmd2.Parameters.Add("@out", OleDbType.NVarCha); myCommand.Parameters["@out"].Direction = ParameterDirection.Output;

          cmd1.ExecuteNonQuery();
          cmd2.ExecuteNonQuery();
      
          transaction.Commit();
      }
      
       catch (SqlException sqlExc)
            {
                foreach (SqlError error in sqlExc.Errors)
                {
                   string errors = string.Format("{0}: ", error.Message);
                    cmd2.Parameters["@out"].Value) = errors;
      

      transaction.Rollback();

                }
            }
      
      finally
      {
          cnn.Close();
          cnn.Dispose();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        • 2021-12-19
        • 2011-12-15
        • 1970-01-01
        相关资源
        最近更新 更多