将参数插入ASP.Net SQL查询

时间:2015-10-26 21:02:44

标签: c# mysql asp.net sql-server

我正在尝试使用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;"

1 个答案:

答案 0 :(得分:0)

目前,变量@DateFilter被视为文字字符串而不是sql命令的一部分,您需要将此变量连接成一个字符串,然后使用系统存储过程{{1}或关键字sp_executesql来执行该字符串(命令)。

更好的方法是使用存储过程并在过程中执行所有这些操作,您也可以获得更好的性能。

Exec(@SqlQuery)