Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.Net SQL查询中插入参数_C#_Mysql_Asp.net_Sql Server - Fatal编程技术网

C# 在ASP.Net SQL查询中插入参数

C# 在ASP.Net SQL查询中插入参数,c#,mysql,asp.net,sql-server,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实际上是下拉控件

我试图用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_selection,这意味着它在运行内置的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>

当变量@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

谢谢,但这个答案看起来不像我想做的。我想使用SqlDataSource运行命令,并在命令运行之前将特定的文本字符串、用户ID和日期范围表达式插入该命令。我该怎么做?我可能会担心,在我构建了工作正常、注释良好的代码之后,可能会使用存储过程来替换旧的东西。
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