我正在实现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错误? 非常感谢
答案 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;
}