【问题标题】:SQL attribute name in parameterized query参数化查询中的 SQL 属性名称
【发布时间】:2014-01-03 13:56:45
【问题描述】:

我正在使用以下功能来检索选择记录。我给了表格我的列名和值,它显示了结果。但问题是,它没有将列名作为参数,例如

public List<Products> ListAllProducts(string searchOption, string searchValue)
{
   db.ClearParameters();
   db.AddParameter(db.MakeInParam("@ColumnName", DbType.String, 50, searchOption));
   db.AddParameter(db.MakeInParam("@Value", DbType.String, 50, searchValue));
   string query = @"SELECT * 
                    FROM [Products] 
                    WHERE @ColumnName LIKE '%'+@Value+'%'";

   ds = db.GetDataSet(query);
   //Rest of code but above query is not executing
}

但是当我使用这样的查询时:

string query = @"SELECT * 
                 FROM [Products] 
                 WHERE "+searchOption+" LIKE '%'+@Value+'%'";  

它运行良好并给我结果。我读过thisthisthis one specially,但不知道。 请指导我。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    参数可以用来代替表达式中的值,仅此而已:特别是,您不能使用参数来表示表名、列名、排序顺序说明符或 SQL 语句中不是值的其他部分。

    您的非参数化查询有效,因为searchOption 被复制到您的 SQL 中,并成为查询字符串的一部分。

    如果您需要构建基于参数更改条件的查询,则需要更改条件以考虑@ColumnName 的所有可能值,如下所示

    string query = @"SELECT * 
                    FROM [Products] 
                    WHERE (@ColumnName='FirstName' AND FirstName LIKE '%'+@Value+'%')
                       OR (@ColumnName='LastName' AND LastName LIKE '%'+@Value+'%')
                       OR (@ColumnName='Location' AND Location LIKE '%'+@Value+'%')";
    

    或退回到动态生成您的查询。只要searchOption 不是直接来自用户输入,即使您的 SQL 是动态生成的,您也可以免受 SQL 注入攻击。

    【讨论】:

      【解决方案2】:

      在尝试时,我遇到了以下选项并发布在答案中,因此其他人可能会从中受益。

      string query = String.Format(
                                   @"SELECT * 
                                   FROM [Products]
                                   WHERE {0} LIKE '%'+@Value+'%'", searchOption
                                  );
      

      所以完整的函数变成:

      public List<Products> ListAllProducts(string searchOption, string searchValue)
      {
        db.ClearParameters();
        db.AddParameter(db.MakeInParam("@Value", DbType.String, 50, searchValue));
        string query = String.Format(
                                     @"SELECT * 
                                     FROM [Products]
                                     WHERE {0} LIKE '%'+@Value+'%'", searchOption
                                    );
      
        ds = db.GetDataSet(query);
          //Rest of code 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 1970-01-01
        相关资源
        最近更新 更多