2015-10-26 59 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