我试图用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