【问题标题】:Parameterized query ado.net issue参数化查询 ado.net 问题
【发布时间】:2011-06-16 17:31:06
【问题描述】:

我正在使用此查询进行分页

string selectStatement = "SELECT * FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY @sortMember @sortDirection ) AS RowNum, * FROM School) AS Rows WHERE RowNum > @pageFrom AND RowNum < @pageTo ";

command.Parameters.Add("@sortDirection", System.Data.SqlDbType.NVarChar, 50);
command.Parameters["@sortDirection"].Value = cmd.SortDescriptors.Count == 0 ? "" : cmd.SortDescriptors[0].SortDirection == System.ComponentModel.ListSortDirection.Ascending ? "" : "DESC";

如果 sortDirection 是 "" 我得到一个异常。 如果你像这样使用它,它工作正常,但我想让它参数化查询。解决办法是什么?

 string selectStatement = string.Format("SELECT * FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY @sortMember {0} ) AS RowNum, * FROM School) AS Rows WHERE RowNum > @pageFrom AND RowNum < @pageTo ",System.ComponentModel.ListSortDirection.Ascending ? "" : "DESC); 

我得到的例外是:'@sortDirection' 附近的语法不正确。

【问题讨论】:

  • 检查@sortDirection 是否有效或者给它一个默认值?

标签: .net sql ado.net


【解决方案1】:

您不能对表名、列、排序依据等内容进行参数化。它们查询。您需要将预期值列入白名单(以避免 SQL 注入)并将其直接连接到查询中(这是您的 string.Format 用法所做的)。

目前,order-by 位于变量的值上,每行都不会改变。本质上,排序(如所写)被忽略了。

【讨论】:

    【解决方案2】:

    这不是参数的工作方式。您必须动态构建查询的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多