我正在尝试使用接受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);
您无法参数化列名。实际上,您无法在常规SQL中做到这一点。
您需要的是Dynamic SQL
。
如果您遵循Microsoft SQL Server上的各种新闻组,则经常会看到人们问为什么不能这样做:
SELECT * FROM @tablename
SELECT @colname FROM tbl
SELECT * FROM tbl WHERE x IN (@list)
对于这三个示例,您可以期望有人回答“使用动态SQL”,并给出有关如何执行此操作的快速示例。不幸的是,对于上述所有三个示例,动态SQL都不是很好的解决方案。另一方面,在某些情况下,动态SQL是最佳或唯一的选择。
Table-Valued Parameters
如果您使用的是SQL Server 2008及更高版本,请同时查看。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句