尝试Catch循环不拦截异常

时间:2019-04-30 15:25:29

标签: c#

我正在实现Windows服务,该服务可以同步SQL数据库和DB2数据库。要连接到旧的DB2数据库,我使用DLL。 我有一个尝试捕获周期,其中从sql数据库写入db2。 没有异常出现,服务会自动关闭。 DLL是否可能不会生成任何异常并自动关闭服务?

我使用以下代码:

public bool InsertProcessToAS400(iDB2Connection cn, Order order)
{
    bool result = false;
    try
    {   
        var code = GetCodeOfDdtConnected(cn, order.Code);
        iDB2Command cmd = cn.CreateCommand();

        cmd.CommandText = $"INSERT INTO PCM00F " +
                          $"(Code)" +
                          $"VALUES(@P1)";

        var p = new iDB2Parameter("@P1", iDB2DbType.iDB2VarChar);
        p.Value = code; cmd.Parameters.Add(p);

        cmd.ExecuteNonQuery();   // <- This close the service

        result = true;
    }
    catch (Exception ex)
    {
        log.Error("An error occurred while Synchronizer (INSERT): ", ex);
        result = false;
    }
    finally
    {
        cmd.Dispose(); cmd = null;
    }

    return result;
}

是否可能由于查询输入参数错误而关闭?如果未触发异常,如何拦截外部dll错误? 非常感谢

1 个答案:

答案 0 :(得分:0)

我用以下代码解决了它:

public bool InsertProcessToAS400(iDB2Connection cn, Order order)
{
      bool result = false;
      try
      {
          DB2Transaction myTrans;
          var code = GetCodeOfDdtConnected(cn, order.Code);
          iDB2Command cmd = cn.CreateCommand();
          // Start a local transaction
          myTrans = cn.BeginTransaction();
          // Assign transaction object for a pending local transaction
          cmd.Transaction = myTrans;

          cmd.CommandText =$"INSERT INTO PCM00F " +
          $"(Code)" +
          $"VALUES(@P1)";

          var p = new iDB2Parameter("@P1", iDB2DbType.iDB2VarChar);
          p.Value = code; cmd.Parameters.Add(p);

          cmd.ExecuteNonQuery();
          myTrans.Commit();
          result = true;
       }
       catch (Exception ex)
       {
           myTrans.Rollback();
           log.Error("An error occurred while Synchronizer (INSERT): ", ex);
           result = false;
       }
       finally
       {
           cmd.Dispose(); cmd = null;
       }

       return result;
}