2015-01-20 2 views
1

Я хочу генерировать SQL-запросы из пользовательского ввода для вставки некоторых данных в базу данных.Преобразование QString для использования в SQL-запросах

Пользователь может вводить что угодно. Есть ли способ в Qt преобразовать такие пользовательские входы в поля значений типа string?

+0

'QSqlQuery query (QString)', который создаст запрос из QString, что вы будете иметь, если у вас есть строка из некоторого lineedit на ui? это помогает? – AngryDuck

+0

@AngryDuck: нет, это не работает, если строка содержит зарезервированные символы, такие как кавычки. Использование bindValue было решением, например. это прекрасно работает: 'query.bindValue («: TextData », QString (« Тест «одиночные метки» и «двойные метки»)); ' –

ответ

4

«Пользователь может ввести что угодно».

Это не дает нам много возможности пройти, но я могу привести пример того, как настроить основной запрос на вставку.

// I assume you already have a QSqlDatabase object called 'db' 
QSqlQuery query(db); 
QString s = "INSERT INTO table (colA, colB) VALUES (:valA, :valB);" 
query.prepare(s); 
// You only need to prepare the query once 
// To actually insert values into colA & colB, do this: 
query.bindValue(":valA", QString("stuff to put in colA")); 
query.bindValue(":valB", QString("other stuff for colB")); 
query.exec(); 
query.finish(); // you probably don't even need this 

Метод bindValue принимает QVariant в качестве второго аргумента (я использовал строки в моем примере, но вы можете использовать что-либо поддерживаемый тип варианта). Вам просто нужно убедиться, что тип значений имеет смысл для соответствующих столбцов в вашей базе данных.

Кроме того, я использую синтаксис PostgreSQL для моего примера. Я думаю, что это стандартно, но вам может потребоваться изменить привязку параметров (:valA:valB) в соответствии с ожидаемым движком db.

+0

OK, bindValue делает замену зарезервированных (по синтаксису SQL) символов тогда? Я попробую. –

+0

У вас могут быть проблемы, если во входной строке есть одна кавычка, так как это разделитель строк SQL. Я не пробовал. –

+1

+1: Да, все! Я часто задавался вопросом, что является преимуществом bindValue, а просто строит строку запроса, используя .arg(). Теперь у меня это есть. bindValue правильно заменяет зарезервированные символы и гарантирует, что значения имеют правильный тип в SQL (добавление «» для строк, например.). КСТАТИ. Использование одиночных кавычек с bindValue отлично работает. –

Смежные вопросы