こちらの以前の質問への回答で、この関連する問題についても質問するようにアドバイスされました。
ときどき、私が持っているレポート生成コードが 2 つの例外をスローします (それらはユーザーに表示されず、すべてが面倒だと思います) が、私はそれらをメールで受け取ります。
1 つ目は、「タイムアウトが発生しました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。」
...そして、その後すぐに続くのは、「テーブル 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];
}
}
}
}
2 番目の例外メッセージは、上記のメソッドの最後の重要な行 (" 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];
}
}
}
}