C# Microsoft DB2 OLE DB提供程序:发生网络库错误(6):句柄无效

C# Microsoft DB2 OLE DB提供程序:发生网络库错误(6):句柄无效,c#,.net,db2,oledbconnection,oledbexception,C#,.net,Db2,Oledbconnection,Oledbexception,我正在使用.netframework4.5和microsoftoledbProvider ForDB2v6连接到DB2,调用存储过程并将数据读取到数据表中 这里是我的代码的摘要,它工作得很好 public DataTable SendQuery(OleDbCommand command) { DataTable table = null; lock (lockObj) { if (connection ==

我正在使用
.netframework4.5
microsoftoledb
Provider ForDB2v6连接到DB2,调用存储过程并将数据读取到数据表中

这里是我的代码的摘要,它工作得很好

    public DataTable SendQuery(OleDbCommand command)
    {
        DataTable table = null;

        lock (lockObj)
        {
            if (connection == null || connection?.State != ConnectionState.Open)
            {
                connection?.Close();

                try
                {
                    connection = new OleDbConnection();
                    connection.ConnectionString = "Provider=DB2OLEDB.1;Password=MyPass;Persist Security Info=True;User ID=MyUser;Initial Catalog=DSNP;Data Source=DSNP;Network Address=5.5.5.5;Network Port=555;Default Schema=MySchema";

                    connection.Open();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

            for (int i = 1; i <= _maxRetry; i++)
            {
                try
                {
                    table = null;
                    command.Connection = connection;

                    OleDbDataAdapter adapter = new OleDbDataAdapter(command);
                    table = new DataTable("ResultTable");

                    adapter.Fill(table);
                    break;
                }
                catch (OleDbException ex)
                {
                    connection?.Close();
                    Connect();

                    if (i == _maxRetry) throw ex;
                }
                catch (Exception ex)
                {
                    throw  ex;
                }
            }
        }
        return (table);
    }
公共数据表SendQuery(OleDbCommand命令) { DataTable=null; 锁(lockObj) { if(connection==null | | connection?.State!=ConnectionState.Open) { 连接?.Close(); 尝试 { 连接=新的OleDbConnection(); connection.ConnectionString=“Provider=DB2OLEDB.1;Password=MyPass;Persist Security Info=True;User ID=MyUser;Initial Catalog=DSNP;Data Source=DSNP;Network Address=5.5.5;Network Port=555;Default Schema=MySchema”; connection.Open(); } 捕获(例外情况除外) { 掷骰子; } }
对于(int i=1;i)odbc跟踪在这里可能会有帮助,以查看封面下发生了什么。如果您有一个可复制的场景,或者如果您可以在重试失败时获得控制(允许您动态启用odbc跟踪),则跟踪可能会有帮助。如果有任何其他诊断源(来自Microsoft工具,或来自Db2服务器诊断)在异常发生前后,他们可能也会提供线索。您的问题是确定问题,而不是编程。
OleDbCommand
DataTable
DataAdapter
都是
IDisposable
。您说代码工作正常,但它多久执行一次重试?因为您说远程系统更糟糕的是,我会冒险猜测连接会断开,代码会在退出之前快速“尝试几次失败的重试”。
Dispose()
可能是一种误导,但始终是一种很好的做法。如果(I==\u maxRetry)throw ex;到
catch(OLEDBEException ex)的顶部,我会移动
阻塞并引入一个
线程。Sleep(1000);//使用500-5000中的值
在重试之前给事情一个恢复的机会。