c# - 在 asp.net 中使用 session 变量作为参数

标签 c# asp.net ado.net

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

这些是执行存储过程所必需的。所有 session 变量都已正确传递。但是,当 gridview 呈现时,它不显示任何数据。我知道有数据,因为我可以在 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();
}

最佳答案

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

设置 session 变量

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

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(解析失败)的情况。

检索 session 变量

我们将 session 变量设置为 DateTime 对象,因此在检索时将它们强制转换:

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

请注意,我们仍在此处使用 native .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

以原始数据格式保存所有内容将使您的生活变得更加轻松。

关于c# - 在 asp.net 中使用 session 变量作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17200135/

相关文章:

c# - Mono.Cecil - 如何获取自定义属性

c# - : public static DateTime ToDateTime(DateTime value) in the . NET Framework 的目的是什么?

c# - 如何使用Ninject

c# - 如何将图像从gridview插入到数据库中的另一个表

sql-server - 无效列名异常

c# - 压缩文件时限制内存使用

asp.net - 将一个 .net 页面从测试部署到实时服务器

asp.net - 图像无法上传到 Amazon S3 服务器

ADO.NET:ExecuteScalar() 连接问题

entity-framework - 您在 Entity Framework 中发现的最烦人的功能(或缺少功能)是什么?