如何异步记录SqlDataAdapter异常?

时间:2016-11-07 07:28:10

标签: sql-server asp.net-mvc asynchronous logging sqldataadapter

我有ASP.NET MVC应用程序,我使用SqlDataAdapter来处理sql server方法。发生异常时,下面的方法不返回任何内容,因此当sql server命令出错时,我没有任何信息。

public int ExecuteNonQuery(string pSql, List<SqlParameter> prm)
    {
        SqlCommand cmd = new SqlCommand(pSql, sqlConnection);
        int result = 0;

        if (sqlConnection.State == ConnectionState.Closed)
        {
            sqlConnection.Open();
        }

        try
        {

            cmd.Parameters.AddRange(prm.ToArray());

            result = cmd.ExecuteNonQuery();


            return result;
        }
        catch (Exception ex)
        {
            return 0;
        }
        finally
        {
            sqlConnection.Close();
        }
    }

如何在不中断用户体验的情况下异步记录异常?此外,我想将其记录到数据库中,如果存在超时异常,则记录此超时可能会在记录时再次超时。

1 个答案:

答案 0 :(得分:0)

您的示例中没有SqlDataAdapter代码。话虽如此,您可以使用three DataAdapter events来响应对数据源上的数据所做的更改。

<强> RowUpdating 下, RowUpdated ,&amp; FillError

还有一个:

  

状态属性,用于确定在此期间是否发生了错误   操作,并且如果需要,控制针对当前的动作   并产生行。

当出现错误时,您可以异步记录这些事件中的异常。

Examples from MSDN

protected static void OnRowUpdated(
  object sender, SqlRowUpdatedEventArgs args)
{
  if (args.Status == UpdateStatus.ErrorsOccurred)
  {
    args.Row.RowError = args.Errors.Message;
    args.Status = UpdateStatus.SkipCurrentRow;

    Task.Run(() => LogError());
  }
}

protected static void FillError(object sender, FillErrorEventArgs args)
{
  if (args.Errors.GetType() == typeof(System.OverflowException))
  {
    // Code to handle precision loss.
    //Add a row to table using the values from the first two columns.
    DataRow myRow = args.DataTable.Rows.Add(new object[]
       {args.Values[0], args.Values[1], DBNull.Value});
    //Set the RowError containing the value for the third column.
    args.RowError = 
       "OverflowException Encountered. Value from data source: " +
       args.Values[2];
    args.Continue = true;

    Task.Run(() => LogError());
  }
}

private void LogError()
{
    // logging code
}