SqlDataAdapter对象CommandTimeOut在C#中不起作用

问题描述 投票:0回答:2

我正在使用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());
        }
    }
}
c# sql-server sqldataadapter
2个回答
0
投票

对于数据库操作,有很多超时要考虑:

Command has a timeout

connection has a timeout.

网络部分的每一层都有超时。

另一端的服务器超时。

另一端的服务器可能具有slow loris protection

锁和事务可能会超时(因为在某些时候,其他人可能也想使用该表)。

根据您的注释,您的存储过程将返回“数百万条记录”。威奇很可能是问题所在。那不是一个有用的查询。太多的数据超出了它仅仅是一个网络或数据库问题-并有可能成为客户端上的内存问题。

即使我不记得如此大规模的东西(最大的一次是在100k的情况下,回退得过多也是一个常见的错误。用户无法处理此类信息,因此必须进行更多的过滤,分页等操作。切勿在客户端中执行这些步骤。充其量,您可以通过网络传输无用的数据量。最糟糕的是,您会遇到超时和并发问题。始终在查询中进行尽可能多的过滤,分页等。

您希望总体上获取尽可能少的数据。通常应在DBMS中完成诸如合并,备份等批量操作。如果将其移至客户端,则只会添加另一层故障和两种用于数据的联网方式。

为了获得更好的答案,我将需要更准确的问题信息。


0
投票

您是否尝试在SqlCommand上设置超时? cmd.CommandTimeout = 300;

© www.soinside.com 2019 - 2024. All rights reserved.