在回答上一个问题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];
}
}
}
}
答案 0 :(得分:1)
错误是因为此处的填充或打开部分
try
{
cmd.Connection.Open();
new SqlDataAdapter(cmd).Fill(ds);
}
超时,但是由于您处理异常,执行最终会返回您正在尝试从数据集的静态空表集合返回表的return语句。
超时可能由于多种原因而发生。可能需要更多信息,但如果您在管理工作室中使用sql profiler,您应该能够了解连接是否打开,是否调用proc,尝试运行多长时间以及导致超时的部分。如果它在别处工作,请捕获输入参数并直接尝试。
同时将超时设置为0应该为您提供最大可能。