C# 在ASP.Net SQL查询中插入参数
我试图用C和ASP.Net替换一些运行SQL查询的旧代码。旧代码运行一个复杂的函数,将查询构建为字符串。我将用GridView控件和SqlDataSource替换它。SqlDataSource包含一个查询,该查询有两个参数:雇员ID EID和时间范围DateFilter。第二个筛选器当前是一个表达式: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实际上是下拉控件
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