我正在尝试使用C#和ASP.Net替换一些运行SQL查询的旧代码。旧代码运行一个复杂的函数来将查询构建为字符串。我正在用GridView控件和SqlDataSource替换它。 SqlDataSource包含一个具有两个参数的查询:员工ID(EID)和时间范围(DateFilter)。第二个过滤器目前是一个表达式:
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 :(得分:0)
目前,变量@DateFilter
被视为文字字符串而不是sql命令的一部分,您需要将此变量连接成一个字符串,然后使用系统存储过程{{1}或关键字sp_executesql
来执行该字符串(命令)。
更好的方法是使用存储过程并在过程中执行所有这些操作,您也可以获得更好的性能。
Exec(@SqlQuery)