如何使用“填充方法”为执行存储过程的OracleDataAdapter设置连接生命周期超时?

时间:2010-07-12 17:16:49

标签: c# .net oracle

我有一些.NET代码,它使用ADO.NET库从Oracle存储过程中检索结果,并将结果填充到DataTable中,如下所示:

using System.Data.OracleClient;

public DataTable getData()
{
    OracleConnection conn = new OracleConnection("Data Source=DATASOURCE;Persist Security Info=True;User ID=userID;Password=userPass;Unicode=True;Min Pool Size=1;Max Pool Size=20;Connection Lifetime=300");
    DataTable dt = new DataTable();
    conn.Open();
    try
    {
       OracleCommand oraCmd = new OracleCommand();
       oraCmd.Connection = conn;
       oraCmd.CommandText = "stored_procedure.function_name";
       oraCmd.CommandType = CommandType.StoredProcedure;
       oraCmd.Parameters.Add("cursor", OracleType.Cursor).Direction = ParameterDirection.Output;
       OracleDataAdapter oraAdapter = new OracleDataAdapter(oraCmd);
       oraAdapter.Fill(dt);
    }
    finally
    {
       conn.Close();
       return dt;
    }
}

此代码在我已实现代码的几个项目上一直没有任何问题。但是我遇到了一个新项目的问题,其中Oracle数据库机器的响应速度实际上要慢得多,而且当太多客户端开始访问硬件时,它似乎变得没有响应。我想要做的是在oraAdapter.Fill命令上实现某种超时 - 因为当数据库变得无响应时,.NET应用程序将挂起'Fill'方法长达10分钟或更长时间,永远不会到达'finally'代码块并关闭数据库连接。

我所处的环境只限于使用MSDN Library连接到Oracle数据库,所以我希望我可以使用ADO.NET控件来实现。

2 个答案:

答案 0 :(得分:1)

使用System.Data.OracleClient .NET 3.5提供程序时CommandTimeout属性不起作用。如果不使用外部库,似乎不支持此功能。

答案 1 :(得分:0)

您似乎需要CommandTimeout属性,而不是ConnectionTimeout。