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