C# 捕获异常并保存到SQL Server

C# 捕获异常并保存到SQL Server,c#,sql,sql-server,exception,C#,Sql,Sql Server,Exception,我正在捕获一个异常,我想将其写入SQL Server,但我的程序没有写入 我没有收到任何错误,但在SQL Server中我没有发现任何错误 catch (Exception f) { String error = f.ToString(); SqlConnection konekt = new SqlConnection(connectionstring); SqlCommand prikaz = new SqlCommand("insert into ERROR_L

我正在捕获一个异常,我想将其写入SQL Server,但我的程序没有写入

我没有收到任何错误,但在SQL Server中我没有发现任何错误

catch (Exception f)
{ 
    String error = f.ToString();
    SqlConnection konekt = new SqlConnection(connectionstring);

    SqlCommand prikaz = new SqlCommand("insert into ERROR_LOG (ULOHA, OPERACE, POPIS, MESSAGE, DATUM) values ('3', '3', 'Chyba v ExportNOHEL', @error, @datum)", konekt);
    konekt.Open();
    prikaz.Parameters.AddWithValue("@error", error);
    prikaz.Parameters.AddWithValue("@datum", DateTime.Now);

    prikaz.ExecuteNonQuery();

    konekt.Close();
 }

您知道问题出在哪里吗?

如果您没有收到任何错误,并且您100%确定您确实在写入正确的数据库,那么可能是您有一个环境事务,例如
TransactionScope
(正在回滚您的事务)

检查这一点的一种方法是在
konekt.Close()上放置一个断点然后切换到SQL查询分析器并执行以下操作

select * from error_log (NOLOCK) 
看看日志是否在那里。如果是,然后在继续代码时回滚,则可以按如下方式抑制环境事务:

        using (new TransactionScope(TransactionScopeOption.Suppress))
        using (var konekt = new SqlConnection(connectionstring))
        using (var prikaz = new SqlCommand("insert into ERROR_LOG (ULOHA, OPERACE, POPIS, MESSAGE, DATUM) values ('3', '3', 'Chyba v ExportNOHEL', @error, @datum)", konekt))
        {
           konekt.Open();
           prikaz.Parameters.AddWithValue("@error", "ASASAS");
           prikaz.Parameters.AddWithValue("@datum", DateTime.Now);
           prikaz.ExecuteNonQuery();
           konekt.Close();
        }

如果您没有收到任何错误,并且100%确定您确实在写入正确的数据库,则可能是您有一个环境事务,例如
TransactionScope
(正在回滚您的事务)

检查这一点的一种方法是在
konekt.Close()上放置一个断点然后切换到SQL查询分析器并执行以下操作

select * from error_log (NOLOCK) 
看看日志是否在那里。如果是,然后在继续代码时回滚,则可以按如下方式抑制环境事务:

        using (new TransactionScope(TransactionScopeOption.Suppress))
        using (var konekt = new SqlConnection(connectionstring))
        using (var prikaz = new SqlCommand("insert into ERROR_LOG (ULOHA, OPERACE, POPIS, MESSAGE, DATUM) values ('3', '3', 'Chyba v ExportNOHEL', @error, @datum)", konekt))
        {
           konekt.Open();
           prikaz.Parameters.AddWithValue("@error", "ASASAS");
           prikaz.Parameters.AddWithValue("@datum", DateTime.Now);
           prikaz.ExecuteNonQuery();
           konekt.Close();
        }

根据您拥有的数据类型,如果
error
太大,数据可能会被截断。这可能有助于:


根据您拥有的数据类型,如果
错误
太大,数据可能会被截断。这可能有助于:


尽管您所做的事情看起来没有任何错误,但将SQL语句硬编码到c#会使调试变得困难,我建议为此在数据库中创建一个新的存储过程,这样您就可以更好地监控操作,通过在存储过程中创建一个适当的try-catch,您也许可以更好地发现哪里出了问题。

尽管您所做的事情看起来没有任何错误,但将SQL语句硬编码到c中确实会使调试变得困难,我建议为此在数据库中创建一个新的存储过程,然后,您可以更好地监视操作,通过在存储过程中创建适当的try-catch,您也许可以更好地发现出了什么问题。

您是否对此进行了调试,以确保引发了异常?从我看到的代码看起来还可以。您是否单步执行了代码?是的,但我没有任何异常…您确定在查看日志表时没有以某种方式清除它吗?开始附加调试器。如果没有任何异常,则不会进入catch块。是否对此进行了调试以确保引发了异常?从我所看到的情况来看,代码看起来不错。您是否单步执行了代码?是的,但我没有任何异常…您确定在查看日志表时没有以某种方式清除它吗?开始附加调试器。如果没有任何异常,则不会进入catch块。