Использование параметризованных параметров 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 и выше.