参数化查询中的SQL属性名称

参数化查询中的SQL属性名称,sql,sql-server,Sql,Sql Server,我正在使用以下函数来检索所选的记录。我给了表我的列名和值,它显示了结果。但问题是,它没有像那样获取列名作为参数: public List<Products> ListAllProducts(string searchOption, string searchValue) { db.ClearParameters(); db.AddParameter(db.MakeInParam("@ColumnName", DbType.String, 50, searchOption)

我正在使用以下函数来检索所选的记录。我给了表我的列名和值,它显示了结果。但问题是,它没有像那样获取列名作为参数:

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
}
它运行良好,并给我结果。我读了,但不知道。
请指导我。

参数可以用来代替表达式中的值,而不需要其他任何东西:特别是,您不能使用参数来表示表名、列名、排序顺序说明符或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注入攻击。

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

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 
}
公共列表ListAllProducts(字符串搜索选项,字符串搜索值)
{
db.ClearParameters();
db.AddParameter(db.MakeInParam(“@Value”,DbType.String,50,searchValue));
字符串查询=string.Format(
@“选择*
来自[产品]
其中{0}类似“%”++@Value++“%”,searchOption
);
ds=db.GetDataSet(查询);
//代码的其余部分
}
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 
}