OracleDataAdapter,Fill方法挂起,如何处理连接终止/删除/删除?

我有一个C#程序连接到远程服务器来查询数据。 数据非常大,因此查询大约需要2分钟才能完成。 在这2分钟的窗口期间,互联网瘫痪了。 这导致作业无法完成程序停留在获取数据例程中。

它建立了连接,但在选择查询期间它被切断了。 将命令超时设置为30秒不起作用。 遇到此错误时,我需要查询失败,因为程序可以处理失败但无法处理卡住。 谢谢!

更新:包含的代码

OracleConnection connection = new OracleConnection(connectionstring); OracleDataAdapter oracleDataAdapter = new OracleDataAdapter(new OracleCommand(query, connection)); oracleDataAdapter.SelectCommand.CommandTimeout = 30; DataSet dataSet = new DataSet(); try { oracleDataAdapter.Fill(dataSet, table); //Hangs on this line when connection is lost return dataSet; } catch { throw; } finally { dataSet.Dispose(); oracleDataAdapter.Dispose(); } 

再次更新:

我需要做的是处理这种情况,因为我不想要一个悬空过程。

最简单的是,一旦连接丢失,程序将抛出错误。 这就是我不知道该怎么做。 我假设commandtimeout将修复它,但它没有。

有一些重复报告此问题,例如: 当适配器填充数据表时连接丢失时系统挂起

我在MSDN上发现了一个很好的线程,其中OP回答:

我已经解决了这个问题了一会儿,对不起,我忘了来,让大家都知道。 我发现代码在该行停止执行,因为(由于某种原因)已经存在与数据库的开放连接。

因为DA.Fill本身会打开一个连接,如果之前没有打开过,那么它就会出现一个混乱和轰炸。

我通过放置Connection.Close()来解决这个问题; 在需要与数据库建立任何连接之前和之后。

基于此,我们可以看到您没有明确打开与数据库的连接。 建议你做一个:

connection.Open();

还要按照Steve Py的回答using确认您正在关闭连接并处置非托管资源。

我看到你的陈述有几个问题,假设它使用的是ODP.Net。 请尝试以下方法:

 DataSet dataSet = new DataSet(); using (OracleConnection connection = new OracleConnection(connectionstring)) { using (OracleDataAdapter oracleDataAdapter = new OracleDataAdapter(new OracleCommand(query, connection))) { oracleDataAdapter.Fill(dataSet, table); } } return dataSet; 

使用块将处理连接和数据适配器的处理。 在您的示例中,连接未被处置,这可能是您的问题的一部分。 另外,如果您打算返回数据集,我认为您不想处置数据集。

因为你使用Throw冒泡exception我删除了exception处理。 请记住,这会使exception冒泡,因此在调用代码链的某处,您需要捕获exception并处理它。 如果应用程序只是坐在那里,那么要警惕任何空的“捕获”块吃exception。

更新的答案:

  DataSet dataset = new DataSet(); using (OracleConnection connection = new OracleConnection(connection)) { using (OracleDataAdapter oracleDataAdapter = new OracleDataAdapter(new OracleCommand(query, connection))) { oracleDataAdapter.SelectCommand.CommandTimeout = 30; connection.Open(); oracleDataAdapter.Fill(dataset, table); } } return dataset;