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