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中的值
在重试之前给事情一个恢复的机会。