1

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

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

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

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

4

2 回答 2

0

试试这个,希望能给你解决方案

字符串 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;

交易。回滚();

          }
      }

finally
{
    cnn.Close();
    cnn.Dispose();
}
于 2013-09-24T13:05:50.937 回答
0

你在使用 RaiseError 事件吗?

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

了解更多信息

引发错误

数据库引擎严重级别

于 2013-09-24T12:48:35.243 回答