2015-10-26 94 views
0

我試圖用C#和ASP.Net替換一些運行SQL查詢的舊代碼。舊的代碼運行一個精心設計的函數來將查詢構建爲一個字符串。我用GridView控件和SqlDataSource替換它。 SqlDataSource包含一個具有兩個參數的查詢:僱員ID(EID)和時間範圍(DateFilter)。這第二個過濾器目前是一個表達式:插入參數到ASP.Net SQL查詢

and a.end_dt >= Dateadd(m, Datediff(m, 0, Dateadd(m, -1, current_timestamp)), 0) 

其中「-1」實際上是一個下拉控件的值。

問題:我無法插入@EID和@DateFilter的值。如果我只是直接將上面的代碼放入SQL查詢中,它運行良好,可以在上個月左右的事件中獲得結果。如果我嘗試將該文本插入到@DateFilter中,則會發生崩潰,並說「附近的@DateFilter語法不正確」。

我在這裏飛行盲人,因爲我無法訪問至少有一個關聯記錄的EID,所以我無法確認@EID是否已經取代了它的值。但@DateFilter看起來好像沒有被替換,從語法錯誤來看。

SqlDataSource的參數是「OnSelecting =」DSTravel_Selecting「」,意思是在運行Select語句之前調用該函數。該功能是爲了做這樣的變量替換:

if(Session["eid"] == null) 
    { 
    e.Command.Parameters.Add(new SqlParameter("@EID", "null")); 
    } 
else 
    { 
    e.Command.Parameters.Add(new SqlParameter("@EID", Session["eid"])); 
    } 

    filter = " " // For debugging. Should be the above-quoted expression. 

    e.Command.Parameters.Add(new SqlParameter("@DateFilter", filter)); 

但該函數只是給了我「錯誤的語法」錯誤。我也曾嘗試事先定義的參數,在標籤內:

<SelectParameters> 
             <asp:Parameter Name="EID" Type="String" /> 
             <asp:Parameter Name="DateFilter" Type="String" /> 
            </SelectParameters> 

,但我有沒有更多的運氣,當我再嘗試在C#功能來引用這些參數。我需要做些什麼來簡單地用在SQL查詢運行之前運行的函數中確定的特定塊文本替換兩個@參數?

哦,一部分實際的查詢是:

SelectCommand="select [various things] from [table] where a.record_locator IS NOT NULL and (a.eid='@EID' or 1=1) @DateFilter order by a.end_date;" 

回答

0

此刻的你變@DateFilter被視爲一個字符串,而不是SQL命令的一部分,你需要連接這變成一個字符串,然後使用系統存儲過程sp_executesql或關鍵字Exec(@SqlQuery)來執行該字符串(命令)。

更好的方法是使用存儲過程並在過程中執行所有這些操作,您也可以獲得更好的性能。

CREATE PROCEDURE my_Proc 
    @EID   VARCHAR(20) = NULL 
,@DateFilter DATE  = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 
    Declare @Sql NVARCHAR(MAX); 

SET @Sql = N'select [various things] 
      from [table] 
      where record_locator IS NOT NULL ' 
     + CASE WHEN @EID IS NOT NULL 
      THEN N' AND eid = @EID ' ELSE N''END 
     + CASE WHEN @DateFilter IS NOT NULL 
      THEN N' AND end_dt >= Dateadd(m, Datediff(m, 0, Dateadd(m, -1, current_timestamp)), 0)' 
       ELSE N'' END 

      + N' order by a.end_date;' 

Exec sp_executesql @Sql 
        ,N'@EID VARCHAR(20)' 
        ,@EID 
END 
+0

謝謝,但這個答案看起來不像我想要做的。我想使用SqlDataSource來運行命令,並在運行之前將特定的文本字符串(用戶標識和日期範圍表達式)插入到該命令中。我怎麼做?我可能會擔心在構建工作之後使用存儲過程,並且有充分評論的代碼來替換舊的東西。 – Snow