使用带有 sqlcommandbuilder 的参数化参数 [无数据适配器]
Posted
技术标签:
【中文标题】使用带有 sqlcommandbuilder 的参数化参数 [无数据适配器]【英文标题】:Using parametrized parameters WITH sqlcommandbuilder [no dataadapter] 【发布时间】:2013-11-25 16:16:49 【问题描述】:我正在尝试使用参数化查询,该查询采用 2 个列名和一个表名,并从 sql server 数据库中检索数据。
问题是无法对表名进行参数化,所以我找到了一个使用 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);
【问题讨论】:
【参考方案1】:您不能参数化列名。实际上,您不能在 常规 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
。
【讨论】:
动态 SQL 容易受到攻击吗? @AngelicCore 我不这么认为.. sommarskog.se/dynamic_sql.html#SQL_injection以上是关于使用带有 sqlcommandbuilder 的参数化参数 [无数据适配器]的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 SqlCommandBuilder 的 TableAdapter 和导出到 DataTable 的工作表来更新 SQL 数据库表
SQLCommandBuilder - 仅从 DataTable 更新“追加”数据库表
使用没有主键的 SQLAdapter 和 SQLCommandBuilder