c# - 使用参数化参数 WITH sqlcommandbuilder [无数据适配器]

标签 c# sql prepared-statement

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

最佳答案

您不能参数化列名。实际上,您不能在常规 SQL 中执行此操作。

你需要的是Dynamic SQL .

If you follow the various newsgroups on Microsoft SQL Server, you often see people asking why they can't do:

SELECT * FROM @tablename
SELECT @colname FROM tbl
SELECT * FROM tbl WHERE x IN (@list)

For all three examples you can expect someone to answer Use dynamic SQL and give a quick example on how to do it. Unfortunately, for all three examples above, dynamic SQL is a poor solution. On the other hand, there are situations where dynamic SQL is the best or only way to go.

也看看Table-Valued Parameters如果您使用 SQL Server 2008 及更高版本。

关于c# - 使用参数化参数 WITH sqlcommandbuilder [无数据适配器],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19947412/

相关文章:

c# - NetworkStream.Write 立即返回 - 我如何知道它何时完成发送数据?

c# - 如何使用我自己的类作为 edmx 模型类?

java - Spring Batch 子句中的准备语句

c# - 如何从中继器控件检索详细信息以在模式弹出窗口中显示

c# - HttpClient GetAsync 线程池饥饿

mysql - 根据另一个列值对列求和

mysql - SQL COUNT DISTINCT 值通过 JOIN 绑定(bind)到记录

SQL查询汇总不同表中的字段

mysql - 为多个值编写一个 SQL 查询

java - 如何使用java准备语句在mysql的date_sub函数中添加单位