3

我正在尝试使用参数化查询,该查询采用 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);
4

1 回答 1

3

您不能参数化列名。实际上,您不能在常规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 及更高版本,还请查看。

于 2013-11-13T07:15:06.297 回答