在asp.net中使用会话变量作为参数

本文关键字:变量 参数 会话 asp net | 更新日期: 2023-09-27 18:19:01

我必须遵循在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());

这些是执行存储过程所必需的。所有会话变量都被正确传递。然而,当gridview渲染时,它没有显示任何数据。我知道存在数据,因为我可以在SSMS上运行存储过程,并且它可以完美地运行传递给该过程的参数(当我输入它们时)。

在这一点上我很困惑,所以任何帮助都是有帮助的。

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();
}

在asp.net中使用会话变量作为参数

我认为您的问题与您使用和比较日期作为字符串而不是日期这一事实有关。您的结果集为空,因为您的查询正在尝试按字母顺序而不是按时间顺序比较日期字符串。要重构你的代码,我要确保你处理了以下几个方面:

设置会话变量

仔细解析文本字段中的日期。

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类型

设置查询参数

使用DateTime结构体的.Date属性来删除时间组件:

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
将所有内容保持在其原始数据格式将使您的工作更轻松。

从代码中删除.ToString()调用