Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlDataAdapter对象CommandTimeOut在C中不起作用#_C#_Sql Server_Sqldataadapter - Fatal编程技术网

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

C# SqlDataAdapter对象CommandTimeOut在C中不起作用#,c#,sql-server,sqldataadapter,C#,Sql Server,Sqldataadapter,我正在使用一个SqlDataAdapter从一个存储过程中提取一个结果,执行和返回结果需要5分钟 我正在使用 da.SelectCommand.CommandTimeout = 1800; 设置,但超时不起作用。该代码不符合实际超时时间。它失败得更早 知道如何修复这个超时吗 这是我的代码: var cpdbconn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL"].ConnectionString); u

我正在使用一个
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());
        }
    }
}

对于数据库操作,需要考虑一系列超时:

这个

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

另一端的服务器超时

另一端的服务器可能有

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

根据您的评论,存储过程返回“数百万条记录”。问题可能就在这里。这不是一个可用的查询。这是如此之多的数据,它不仅仅是一个网络或数据库问题,而且可能成为客户机上的内存问题

这是一个常见的错误,检索太多,即使我不能完全记住这个规模(最大的是在10万的)。用户无法处理此类信息,因此必须进行更多的过滤、分页等操作。永远不要在客户端执行这些步骤。充其量只能通过网络传输无用的数据。在最坏的情况下,您会遇到超时和并发问题。始终在查询中执行尽可能多的筛选、分页等操作

总体而言,您希望检索尽可能少的数据。合并、备份等批量操作通常应在DBMS中完成。如果将其移动到客户端,则只会为数据添加另一层故障和两种联网方式


为了得到更好的答案,我需要更精确的问题信息。

您是否尝试在SqlCommand上设置超时<代码>cmd.CommandTimeout=300

“存储过程最多需要5分钟来执行结果。”您要如何处理需要5分钟才能执行的可怜的数据库?正常响应时间以毫秒为单位。为了避免这5分钟,可能需要进行一次小的重新设计。同时也会有一系列的超时。CommandTimeout、连接超时、另一端的服务器超时、Lorris检测缓慢等。StoredProdcuede生成了数百万条记录。因此,SP的执行时间是预期的,在连接字符串中添加超时,上面的一行帮助我解决了这个问题