0

こちらの以前の質問への回答で、この関連する問題についても質問するようにアドバイスされました。

ときどき、私が持っているレポート生成コードが 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];
            }
        }
    }
}
4

1 に答える 1

1

エラーは、ここの塗りつぶしまたは開いた部分が原因です

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

タイムアウトしていますが、例外を処理するため、データセットのまだヌルのテーブル コレクションからテーブルを返そうとしている return ステートメントに実行がヒットします。

タイムアウトは、さまざまな理由で発生する可能性があります。おそらくそれにはさらに情報が必要ですが、管理スタジオでSQLプロファイラーを使用すると、接続が開いているかどうか、procが呼び出されているかどうか、実行しようとしている時間の長さ、およびタイムアウトの原因となっている部分についてのアイデアを得ることができるはずです. 他の場所で機能する場合は、入力パラメーターをキャプチャして、それらを直接試してください。

また、タイムアウトを 0 に設定すると、可能な最大値が得られます。

于 2016-06-03T16:43:06.280 に答える