如何在C#中捕获SQLException?

如何在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)

在这里,我尝试在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)
          {
           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
作为log4net
ILog
)的解决方案

挡块:

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
作为log4net
ILog
)的解决方案

挡块:

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);
}