2013-06-19 62 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