0

在此处对上一个问题的回答中,建议我也询问此相关问题。

有时,我的报告生成代码会引发两个异常(它们不会显示给用户,而且他们认为一切都是笨拙的),但我会通过电子邮件将它们发送给我。

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

...而此后总是很快跟进的是,“找不到表 0

第一条异常消息认为,以下方法中 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];
            }
        }
    }
}
4

1 回答 1

1

错误是因为这里的 Fill 或 open 部分

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

正在超时,但是由于您处理了异常,因此执行最终会遇到您尝试从数据集的仍然为空的表集合中返回表的返回语句。

发生超时的原因有很多。可能需要更多信息,但是如果您在管理工作室中使用 sql 分析器,您应该能够了解连接是否打开、是否被调用、尝试运行多长时间以及导致超时的部分。如果它在其他地方有效,请捕获您的输入参数并直接尝试。

此外,将超时设置为 0 应该可以为您提供最大的可能。

于 2016-06-03T16:43:06.280 回答