如何在C#中捕获SQLException?
在这里,我尝试在Sqlserver中的SMO项目中使用innerexception捕获sql异常 我收到了这个错误消息如何在C#中捕获SQLException?,c#,sql-server,C#,Sql Server,在这里,我尝试在Sqlserver中的SMO项目中使用innerexception捕获sql异常 我收到了这个错误消息 Msg 121, Level 15, State 1, Procedure test_sp_syntaxtext, Line 124 The select list for the INSERT statement contains more items than the insert list. 但是通过使用这个代码 catch (Exception ex)
Msg 121, Level 15, State 1, Procedure test_sp_syntaxtext, Line 124
The select list for the INSERT statement contains more items than the insert list.
但是通过使用这个代码
catch (Exception ex)
{
ErrorFlag = true;
//ex.Source.ToString();
e2dInsertAndGenerateErrorLog(ex.InnerException.Message.ToString(), FileName, "CHECKINAPPLY", PathName, "ErrorLog.Err");
}
我明白了
The select list for the INSERT statement contains more items than the insert list.
我也需要缓存这条线
Msg 121, Level 15, State 1, Procedure test_sp_syntaxtext, Line 124
有什么建议吗
编辑:
使用
catch(SqlException-ex)
{
对于(int i=0;i
使用
catch(SqlException-ex)
{
对于(int i=0;i
看看您在
您将需要捕获
SqlException
,而不仅仅是任何异常。查看您在中找到的属性
您需要捕获
SqlException
,而不仅仅是任何异常。在记录异常时,最好记录整个事件,尤其是stacktrace。堆栈跟踪是最重要的部分。如果只记录ex.ToString()
,则不会丢弃该信息。在记录异常时,最好记录整个事件,尤其是stacktrace。堆栈跟踪是最重要的部分。如果您只记录ex.ToString()
,则不会丢弃该信息。试试看
catch(SqlException-ex){}
而不是catch(Exception-ex){}
查看有关SqlException的信息。试试看
catch(SqlException-ex){}
而不是catch(Exception-ex){}
请看一看有关SqlException的信息。我又一次迟到了,但没有一个答案对我来说是正确的。操作上下文是SMO。使用SMO,
SqlException
可以封装为ExecutionFailureException的内部异常。这就是为什么他要查看InnerException
下面是我用于记录SqlException
详细信息(如果存在Logger
作为log4netILog
)的解决方案
挡块:
catch (Exception ex)
{
Logger.Error("Unhandled error", ex);
LogSqlErrors(ex);
}
LogSqlErrors
(注意最后一行,这是处理内部异常的方法):
不幸的是,如果您的sql命令字符串包含许多批处理(使用SMO支持的go
分隔符),这将不会告诉您哪个sql批处理会产生错误。(错误行号是为失败批次计算的,不考虑以前批次的行数。)
我已经检查了ExecutionFailureException
的构建方式(在SMO版本12上使用反编译器):它可以存储此信息,但它没有。所以你只能猜测
此外,如果使用
ContinueOnError
选项,错误将被忽略(不会存储在任何地方)。好吧,如果SMO团队能够改进他们库中的异常处理,那就太好了。我又一次迟到了,但没有一个答案对我来说是正确的。操作上下文是SMO。使用SMO,SqlException
可以封装为ExecutionFailureException的内部异常。这就是为什么他要查看InnerException
下面是我用于记录SqlException
详细信息(如果存在Logger
作为log4netILog
)的解决方案
挡块:
catch (Exception ex)
{
Logger.Error("Unhandled error", ex);
LogSqlErrors(ex);
}
LogSqlErrors
(注意最后一行,这是处理内部异常的方法):
不幸的是,如果您的sql命令字符串包含许多批处理(使用SMO支持的go
分隔符),这将不会告诉您哪个sql批处理会产生错误。(错误行号是为失败批次计算的,不考虑以前批次的行数。)
我已经检查了ExecutionFailureException
的构建方式(在SMO版本12上使用反编译器):它可以存储此信息,但它没有。所以你只能猜测
此外,如果使用
ContinueOnError
选项,错误将被忽略(不会存储在任何地方)。好如果SMO团队能够改进其库中的异常处理,那就太好了。您似乎得到了innerException,顶层Exeption消息呢?您似乎也得到了innerException,顶层Exeption消息呢?请查看我的编辑部分,因为发生错误时不会捕获此sqlexception属于ExecutionFailureException。当与服务器的连接遇到执行失败时,将引发ExecutionFailureException异常。是否在此处处理或修复它?“执行Transact-SQL语句或批处理时发生异常。”-->这是我收到的错误消息,但我想捕获在我的sql查询窗口中出现的确切sql执行选项,如“Msg 121,级别15,状态1,过程测试\u sp\u syntaxtext,第124行INSERT语句的select列表包含的项目多于INSERT列表。select值的数量必须与INSERT列的数量匹配。”查看“我的编辑”部分,因为发生的错误是ExecutionFailureException,因此不会捕获此sqlexception。当与服务器的连接遇到执行失败时,将引发ExecutionFailureException异常。要处理还是修复它
catch (SqlException ex) { ... }
catch (Exception ex)
{
Logger.Error("Unhandled error", ex);
LogSqlErrors(ex);
}
private static void LogSqlErrors(Exception ex)
{
if (ex == null)
return;
var sqlEx = ex as SqlException;
if (sqlEx != null && sqlEx.Errors != null && sqlEx.Errors.Count > 0)
{
var sqlErrs = new StringBuilder();
sqlErrs.AppendFormat("SqlException contains {0} SQL error(s):", sqlEx.Errors.Count)
.AppendLine();
foreach (SqlError err in sqlEx.Errors)
{
sqlErrs.AppendLine("--------------------------------")
.AppendFormat("Msg {0}, Level {1}, State {2}, Procedure '{4}', Line {5}",
err.Number, err.Class, err.State, err.Procedure, err.LineNumber)
.AppendLine()
.AppendLine(err.Message);
}
Logger.Warn(sqlErrs.ToString());
}
LogSqlErrors(ex.InnerException);
}