使用带有 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

为啥我们要使用 sqlcommandbuilder?

在 ASP.NET 中使用 SqlCommandBuilder

sqlCommandBuilder 更新未按预期工作