0

我编写了一个 .Net Windows 服务,每 4 小时将数据从 4D 数据库 (v12) 复制到 SQL Server 数据库。它在 Windows 7 32 位上运行并作为本地系统运行。我正在使用 4D ODBC 驱动程序的 12.02 版。

当服务 1st 运行时,一切正常。在第二次运行时,与 SQL Server 的连接仍然有效,但与 4D 的 ODBC 连接出现以下错误:

System.Data.Odbc.OdbcException (0x80131937): 错误 [08001] 客户端无法建立连接: System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode) 处的 SQL Se 在 System.Data.Odbc.OdbcConnectionHandle ..ctor(OdbcConnection 连接,OdbcConnectionString constr,OdbcEnvironmentHandle environmentHandle)在 System.Data.Odbc.OdbcConnectionOpen..ctor(OdbcConnection outerConnection,OdbcConnectionString connectionOptions)在 System.Data.Odbc.OdbcConnectionFactory.CreateConnection(DbConnectionOptions 选项,DbConnectionPoolKey poolKey,对象 poolGroupProviderInfo , DbConnectionPool 池, DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions 选项, DbConnectionPoolKey poolKey, 对象 poolGroupProviderInfo,DbConnectionPool 池,DbConnection owningConnection,DbConnectionOptions userOptions)在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup,DbConnectionOptions userOptions)在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 次重试,DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.Odbc.OdbcConnection.Open() at DataWarehouseLoader.DAL.DWGenerator.Run() at DataWarehouseSvc.DataWarehouseSvc。 OnTimerElapsed(对象发送者,ElapsedEventArgs e)

每次运行后,代码都会小心处理与 SQL Server 和 4D 的连接,方法如下:

using (_connSQL = new SqlConnection(DataWarehouseCS))
{
   _connSQL.Open();

   using (_conn4D = new OdbcConnection(4DCS))
   {
      _conn4D.Open();
      Load4DTables();
   }   
}

一旦发生错误,在我停止/启动服务之前,ODBC 连接将不再工作。这将允许它再次工作一次。我尝试使用系统 DSN 和无 DSN 连接进行连接,但结果是一样的。我相信如果我让服务更频繁地运行,比如每 10 分钟一次,它会工作不止一次,但是当足够长的时间让它停止工作时,一定会发生一些事情。

我很困惑问题是什么。我非常感谢任何帮助或建议尝试。

4

1 回答 1

0

我一直找不到问题所在。我相信这是 4D ODBC 驱动程序中的一个错误。我的解决方法是创建一个单独的控制台应用程序来处理 4D 部分。

我可以在需要时将此控制台应用程序作为服务的新进程启动。这样,当它完成连接到 4D 的控制台应用程序时,它会从内存中卸载,但服务可以保持运行。

从内存中卸载程序似乎可以清除任何 4D 连接问题,并允许后续运行仍然有效。

于 2013-01-22T21:15:09.443 回答