2013-06-19 60 views
2

参数我要以下是必要的参数在SQL Server中执行存储过程2008 R2使用会话变量在asp.net

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

这些都是需要执行一个存储过程。所有会话变量均正确传递。但是,当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(); 
} 
+0

哪里是你的绑定代码? –

+0

我将它添加到问题中。 – MaximusPrime

+2

不需要'ToString()'每个变量; “AddWithValue”的第二个参数的类型是'object'。如果将其保留,最终可能会将变量传递给SQL服务器,但其格式不理解。 –

回答

1

我觉得你的问题涉及到的事实,你正在使用和比较日期为字符串,而不是日期。您的结果集为空,因为您的查询试图按字母顺序比较日期字符串而不是按时间顺序。重构你的代码,我将确保您解决以下几个方面:

设置会话变量

仔细分析的日期从你的文本字段。

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 

柯使用本地数据格式将所有东西都擦亮会让您的生活变得更加轻松。

+0

谢谢Cory!我唯一的其他问题是现在的错误是“对象引用未设置为对象的实例”。并突出显示了“var sessionStartDate =(DateTime)Session”[“StartDate”]“该变量似乎传递给会话,但不传递给存储过程。我更改了sproc,在DATE数据类型中包含startdate和enddate,如上面演示的 – MaximusPrime

+0

当我逐步浏览代码时,它没有选择开始日期,而是选择了结束日期。我会进一步检查 – MaximusPrime

1

从您的代码.ToString()电话。

+0

Igor我这样做,它仍然没有产生任何数据 – MaximusPrime

+0

这是你的代码中显而易见的错误。我不知道变量类型'sessionStartDate','sessionEndDate'和'payment',da.SelectCommand'是如何设置的,你的存储过程需要什么类型的参数。 – Igor

+0

所有会话...变量都是字符串值,存储过程需要VARCHAR值。 VARCHAR和字符串是否正确? – MaximusPrime