Использование параметризованных параметров WITH sqlcommandbuilder [без адаптера данных]

Я пытаюсь использовать параметризованный запрос, который берет 2 имени столбца и имя таблицы и получает данные из базы данных сервера SQL.

Проблема в том, что невозможно параметризовать имя таблицы, поэтому я нашел решение, используя sqlcommandbuilder.quoteIdentifer(имя таблицы), и этот бит работает... но, видимо, они не очень хорошо играют вместе.

Я получаю исключение, содержащее одно слово, которое является именем столбца. Если я ставлю имя столбца от руки, это работает.

Что здесь не так?

    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 - лучший или единственный путь.

Также посмотрите Table-Valued Parameters если вы используете SQL Server 2008 и выше.

Другие вопросы по тегам