参数化查询中的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
}