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

时间:2017-07-05 02:13:35

标签: c# oracle connection-timeout dataadapter

我有一个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将修复它,但它没有。

3 个答案:

答案 0 :(得分:1)

我认为你的陈述存在一些问题,假设它使用的是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冒泡异常,因此我删除了异常处理。请记住,这会使异常冒泡,因此在调用代码链的某处,您需要捕获异常并处理它。如果应用程序只是坐在那里,那么要警惕任何空的" catch"阻止吃异常。

答案 1 :(得分:1)

有一些重复报告此问题,例如:System being hang when the connection is lost while adapter is filling the datatables

我在MSDN找到了一个好的帖子,其中OP回答:

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

     

由于DA.Fill会自动打开一个连接,如果以前没有打开过,那么它就会出现一个混乱和爆炸的情况。

     

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

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

connection.Open();

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

答案 2 :(得分:1)

更新回答:

        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;
相关问题