使用参数化参数WITH sqlcommandbuilder [no dataadapter]

时间:2013-11-13 07:01:49

标签: c# sql sql-parametrized-query

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

1 个答案:

答案 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