2

SQL Server 2008 r2 でストアド プロシージャを実行するために必要なパラメータに従う必要があります。

da.SelectCommand.Parameters.AddWithValue("@StartDate", sessionStartDate.ToString());
da.SelectCommand.Parameters.AddWithValue("@EndDate", sessionEndDate.ToString());
da.SelectCommand.Parameters.AddWithValue("@PaymentType", payment.ToString());

これらは、ストアド プロシージャを実行するために必要です。すべてのセッション変数が正しく渡されます。ただし、グリッドビューがレンダリングされると、データは表示されません。SSMSでストアドプロシージャを実行でき、procに渡されるパラメータ(入力時)で完全に実行されるため、データがあることはわかっています。

この時点でかなり混乱しているので、助けがあれば助かります。

grdDenialDetail.DataSource = ds.Tables["DetailDenial"].DefaultView;
grdDenialDetail.DataBind();

ルーチン全体: (これが役立つかもしれません)

public void ExecuteDetailReport()
{
    string sessionConnection = Session["Company"].ToString();
    string sessionStartDate = Session["StartDate"].ToString();
    string sessionEndDate = Session["EndDate"].ToString();
    string payment = Session["payment"].ToString();

    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings[sessionConnection].ConnectionString);

    SqlDataAdapter da = new SqlDataAdapter("dbo.cusGenDenialReportPivotStylePType", conn);

    da.SelectCommand.CommandType = CommandType.StoredProcedure;

    /*da.SelectCommand.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.VarChar, 11)).Value = sessionStartDate.ToString();
    da.SelectCommand.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.VarChar, 11)).Value = sessionEndDate.ToString();
    da.SelectCommand.Parameters.Add(new SqlParameter("@PaymentType", SqlDbType.VarChar, 100)).Value = payment.ToString();*/
    da.SelectCommand.Parameters.AddWithValue("@StartDate", sessionStartDate);
    da.SelectCommand.Parameters.AddWithValue("@EndDate", sessionEndDate);
    da.SelectCommand.Parameters.AddWithValue("@PaymentType", payment);
    lblTest.Visible = true;
    lblTest.Text = "You selected " + payment + ".";

    DataSet ds = new DataSet();

    da.Fill(ds, "DetailDenial");

    grdDenialDetail.DataSource = ds.Tables["DetailDenial"].DefaultView;
    grdDenialDetail.DataBind();

    da.Dispose();
    conn.Close();
}
4

2 に答える 2

0

あなたの問題は、日付を日付ではなく文字列として使用および比較しているという事実に関連していると思います。クエリが日付文字列を時系列ではなくアルファベット順に比較しようとしているため、結果セットは空です。コードをリファクタリングするには、次の領域に対処する必要があります。

セッション変数の設定

テキスト フィールドから日付を慎重に解析します。

DateTime startDate;
if (DateTime.TryParseExact(txtStartDate.Text, "MM/dd/yyyy", 
        CultureInfo.CurrentCulture, DateTimeStyles.None, out startDate))
{
    Session["StartDate"] = startDate;
}

DateTime endDate;
if (DateTime.TryParseExact(txtEndDate.Text, "MM/dd/yyyy", 
        CultureInfo.CurrentCulture, DateTimeStyles.None, out endDate))
{
    Session["EndDate"] = endDate;
}

TryParseExactメソッドが返された場合false(解析の失敗)を処理したい場合があります。

セッション変数の取得

セッション変数をDateTimeオブジェクトとして設定するため、取得時にキャストバックします。

var sessionStartDate = (DateTime)Session["StartDate"];
var sessionEndDate = (DateTime)Session["EndDate"];

ここではまだネイティブ .NET 型を使用していることに注意してください。

クエリ パラメータの設定

.Date構造体のプロパティを使用してDateTime、時間コンポーネントを削除します。

da.SelectCommand.Parameters.AddWithValue("@StartDate", sessionStartDate.Date);
da.SelectCommand.Parameters.AddWithValue("@EndDate", sessionEndDate.Date);
...

最後に、ストアド プロシージャを更新して、パラメータの型をdate次のようにします。

CREATE PROCEDURE dbo.cusGenDenialReportPivotStylePType
(
    @StartDate date = null,
    @EndDate date = null,
    ...
)
AS
...
    SELECT
        *
    FROM
        Somewhere
    WHERE
        TheDate BETWEEN @StartDate AND @EndDate

すべてをネイティブのデータ形式に保つことで、作業がずっと楽になります。

于 2013-06-19T21:21:54.477 に答える