我正在使用SqlDataAdapter
从存储过程中提取结果,该过程最多需要5分钟执行并返回结果。
我正在使用
da.SelectCommand.CommandTimeout = 1800;
设置,但是超时不起作用。该代码不是真正的超时。较早失败。
知道如何解决此超时吗?
这是我的代码:
var cpdbconn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL"].ConnectionString);
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = cpdbconnection;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = readStoredProcedureName;
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
try
{
da.SelectCommand.CommandTimeout = 1800;
da.Fill(dt);
// Check datatable is null or not
if (dt != null && dt.Rows.Count > 0)
{
foreach (DataRow dataRow in dt.Rows)
{
lstring.Add(Convert.ToString(dataRow["ServerName"]));
}
}
// Add "','" in each row to convert the result to support nested query format
InnerQryResultStr = string.Join("','", lstring.ToArray());
if (multinestedQry != null)
{
combinedQry = qryName;
qryName = multinestedQry + "('" + InnerQryResultStr + "')";
}
else
{
qryName = qryName + "('" + InnerQryResultStr + "')";
}
}
catch (SqlException e)
{
Logger.Log(LOGTYPE.Error, String.Format("Inserting Data Failed for server {0} with Exception {1}", "DiscreteServerData", e.Message));
if(e.Number == -2)
{
Logger.Log(LOGTYPE.Error, String.Format("TimeOut occurred while executing SQL query / stored procedure ", "DiscreteServerData", e.Message));
}
strMsg = e.Message.ToString();
file.WriteLine(strMsg.ToString());
}
}
}
对于数据库操作,有很多超时要考虑:
网络部分的每一层都有超时。
另一端的服务器超时。
另一端的服务器可能具有slow loris protection。
锁和事务可能会超时(因为在某些时候,其他人可能也想使用该表)。
根据您的注释,您的存储过程将返回“数百万条记录”。威奇很可能是问题所在。那不是一个有用的查询。太多的数据超出了它仅仅是一个网络或数据库问题-并有可能成为客户端上的内存问题。
即使我不记得如此大规模的东西(最大的一次是在100k的情况下,回退得过多也是一个常见的错误。用户无法处理此类信息,因此必须进行更多的过滤,分页等操作。切勿在客户端中执行这些步骤。充其量,您可以通过网络传输无用的数据量。最糟糕的是,您会遇到超时和并发问题。始终在查询中进行尽可能多的过滤,分页等。
您希望总体上获取尽可能少的数据。通常应在DBMS中完成诸如合并,备份等批量操作。如果将其移至客户端,则只会添加另一层故障和两种用于数据的联网方式。
为了获得更好的答案,我将需要更准确的问题信息。
您是否尝试在SqlCommand上设置超时? cmd.CommandTimeout = 300;