我有一个记录公司应用程序异常信息的日志器。
当我们记录 SQL 异常时,如果能够看到导致异常的实际查询语句,那将非常有用。
有没有办法实现这一点?
我有一个记录公司应用程序异常信息的日志器。
当我们记录 SQL 异常时,如果能够看到导致异常的实际查询语句,那将非常有用。
有没有办法实现这一点?
SqlException
不保留导致异常的SqlCommand
的引用。在您的日志记录器中无法实现这一点。您可以在执行SqlCommand
的方法中捕获SqlException
并将其包装在更具描述性的异常中。例如:
using (var command = new SqlCommand(connection, "dbo.MyProc"))
{
try
{
command.Execute();
}
catch (DbException ex)
{
throw new InvalidOperationException(ex.Message + " - " + command.Text, ex);
}
}
通过这种方式,您可以记录更具表现力的异常。
您不能抛出SQL异常。我认为他的意思是抛出一个包含command.CommandText的新异常。
using (var command = new SqlCommand(connection, "dbo.MyProc"))
{
try
{
command.Execute();
}
catch (SqlException ex)
{
ex.Data.Add("Sql",command.Text);
throw ex
}
}
protected virtual TResult ExecuteAndLogError<TResult>(Func<TResult> code, string sql, SqlParameterCollection parameters = null)
{
try {
if ((System.Diagnostics.Debugger.IsAttached))
PrintSqlToDebug(sql, parameters);
return code();
} catch (Exception ex) {
LogError(sql, parameters, ex);
throw;
}
}
public virtual DataTable ExecuteDataTable(SqlCommand command, params SqlParameter[] parameters)
{
command.Parameters.AddRange(parameters);
DataTable table = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(command)) {
using (command) {
ExecuteAndLogError(() => adapter.Fill(table), command.CommandText, command.Parameters);
}
}
return table;
}
您可以这样使用:repo.ExecuteDataTable("SELECT * FROM Users");
如果出现异常,您可以实现LogError方法以进行额外的日志记录。