我正在尝试使用参数化查询,该查询采用2个列名和一个表名,并从sql server DB中检索数据。
问题是无法对表名进行参数化,所以我找到了一个使用sqlcommandbuilder.quoteIdentifer(tablename)的解决方案,这个位有效......但显然它们并不能很好地协同工作。
我得到的异常包含一个单词,即列名 如果我手动输入列名称就可以了。
这里有什么问题?
public List<ItemsWithDescription> GetItemsFromDB(string name, string desc, string tableName)
{
List<ItemsWithDescription> items = new List<ItemsWithDescription>();
try
{
Status = 1;
SqlCommandBuilder builder = new SqlCommandBuilder();
cmd = new SqlCommand("Select @Name, @Desc from "+ builder.QuoteIdentifier(tableName), conn);
cmd.Parameters.AddWithValue("@Name", name);
cmd.Parameters.AddWithValue("@Desc", desc);
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
items.Add(new ItemsWithDescription(dr[name].ToString(), dr[name].ToString() + " | " + dr[desc].ToString()));
}
}
items.Sort((x, y) => string.Compare(x.Item, y.Item));
}
catch
{
Status = -1;
}
return items;
}
编辑: 这有效,但我更愿意知道为什么两者不能一起使用:
cmd = new SqlCommand("Select" +
builder.QuoteIdentifier(name) + "," +
builder.QuoteIdentifier(desc) + "from " +
builder.QuoteIdentifier(tableName), conn);
答案 0 :(得分:3)
您无法参数化列名称。实际上,您无法在常规 SQL中执行此操作。
您需要的是Dynamic SQL
。
如果您关注Microsoft SQL Server上的各种新闻组,那么 经常看到人们问他们为什么不能这样做:
SELECT * FROM @tablename
SELECT @colname FROM tbl
SELECT * FROM tbl WHERE x IN (@list)
对于所有三个示例,您可以期待有人回答使用动态 SQL并给出一个如何做的快速示例。不幸的是,对所有人 以上三个例子,动态SQL是一个糟糕的解决方案。在另一 手,有些情况下动态SQL是最好的或唯一的方式 去吧。
如果您使用SQL Server 2008及更高版本,请查看Table-Valued Parameters
。