为什么我会“超时”和“找不到表0”以及我可以采取哪些预防措施?

时间:2016-05-25 17:32:10

标签: c# dataset sqlcommand sqldataadapter command-timeout

在回答上一个问题here时,我被建议也询问这个相关问题。

有一段时间,报告生成代码我抛出了两个例外(它们没有显示给用户,他们认为一切都很笨拙),但我通过电子邮件发送给我。

第一个是,“超时已到期。在操作完成之前已经过了超时时间,或者服务器没有响应。

...之后总是紧随其后的是“找不到表0

第一个exeption消息表明下面方法中try部分中的最后一行代码(“new SqlDataAdapter(cmd).Fill(ds);”)抛出异常:

public static DataTable ExecuteSQLReturnDataTable(string sql, 
    CommandType cmdType, params SqlParameter[] parameters)
{
    using (var ds = new DataSet())
    {
        using (var connStr = new SqlConnection(CPSConnStr))
        {
            using (var cmd = new SqlCommand(sql, connStr))
            {
                cmd.CommandType = cmdType;
                cmd.CommandTimeout = EXTENDED_TIMEOUT;
                foreach (var item in parameters)
                {
                    cmd.Parameters.Add(item);
                }

                try
                {
                    cmd.Connection.Open();
                    new SqlDataAdapter(cmd).Fill(ds);
                }
                catch (Exception ex)
                {
                    RoboReporterConstsAndUtils.HandleException(ex);
                }
                return ds.Tables[0];
            }
        }
    }
}

第二个异常消息声称它来自上面方法中的最后一个重要行(“ return ds.Tables [0]; ”)以及这个:

var dtFillRateResults =
    RoboReporterSQL.ExecuteSQLReturnDataTable
       (FILL_RATE_BY_DISTRIBUTOR_BY_CUSTOMER_STORED_PROC,
        CommandType.StoredProcedure,
            new SqlParameter()
            {
                ParameterName = "@Unit",
                SqlDbType = SqlDbType.VarChar,
                Value = _unit
            },
            new SqlParameter()
            {
                ParameterName = "@Member",
                SqlDbType = SqlDbType.VarChar,
                Value = _memberId
            },
            new SqlParameter()
            {
                ParameterName = "@BegDate",
                SqlDbType = SqlDbType.DateTime,
                Value = Convert.ToDateTime(_dateBegin)
            },
            new SqlParameter()
            {
                ParameterName = "@EndDate",
                SqlDbType = SqlDbType.DateTime,
                Value = Convert.ToDateTime(_dateEnd)
            }
    );

FILL_RATE_BY_DISTRIBUTOR_BY_CUSTOMER_STORED_PROC 是一个存储过程,在我的努力和活动之前的其他地方使用,所以不是SP本身导致问题。

对于超级好奇的人来说,上面代码中的定制方法调用是:

public static DataTable ExecuteSQLReturnDataTable(string connectionStr,     
    string sql, CommandType cmdType, params SqlParameter[] parameters)
{
    using (var ds = new DataSet())
    {
        using (var connStr = new SqlConnection(connectionStr))
        {
            using (var cmd = new SqlCommand(sql, connStr))
            {
                cmd.CommandType = cmdType;
                cmd.CommandTimeout = EXTENDED_TIMEOUT;
                foreach (var item in parameters)
                {
                    cmd.Parameters.Add(item);
                }

                try
                {
                    cmd.Connection.Open();
                    new SqlDataAdapter(cmd).Fill(ds);
                }
                catch (Exception ex)
                {
                    RoboReporterConstsAndUtils.HandleException(ex);
                    return null;
                }
                return ds.Tables[0];
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

错误是因为此处的填充或打开部分

try
{
    cmd.Connection.Open();
    new SqlDataAdapter(cmd).Fill(ds);
}

超时,但是由于您处理异常,执行最终会返回您正在尝试从数据集的静态空表集合返回表的return语句。

超时可能由于多种原因而发生。可能需要更多信息,但如果您在管理工作室中使用sql profiler,您应该能够了解连接是否打开,是否调用proc,尝试运行多长时间以及导致超时的部分。如果它在别处工作,请捕获输入参数并直接尝试。

同时将超时设置为0应该为您提供最大可能。