2012-01-08 2 views
4

Следующий код создает таблицу и заполняет базу данных данными. При запуске приведенного ниже кода я получаю сообщение об ошибке 'Parameter count mismatch' на query.exec(). Однако, если я использую прокомментированную строку, все работает нормально. Как я злоупотребляю функцией подготовки?QSqlQuery - Подготовить сбой с «несоответствием счетчика параметров»

QSqlQuery query; 
if (query.exec("CREATE TABLE Users (u_ID INT IDENTITY(1,1) PRIMARY KEY, cName varchar(25) UNIQUE)")) 
{ 
    for (int i=1;i<=100;++i) 
    { 
     QString uName; 
     uName = "user" + QString::number(i); 
     query.prepare("INSERT INTO Users (cName) VALUES(':UNAME')"); 
     query.bindValue(":UNAME",uName); 
     query.exec(); 
     //query.exec("INSERT INTO Users (cName) VALUES('" + uName + "')"); 
     if (query.lastError().isValid()){ 
      QMessageBox::information(0,"ERR!",query.lastError().text()); 
     } 
    } 
} 

ответ

5

Просто используйте:

query.prepare("INSERT INTO Users (cName) VALUES(:UNAME)"); 

т.е. не процитировать переменные связывания.

+0

+1: Строки '' 'вокруг строк, экранирование строк и все другие соображения типа предназначены для вас в параметризованных запросах. – MatBailie

+0

Итак, при использовании готового файла безопасно для «сырых» пользовательских данных? – Serodis

+0

Да, если вы используете переменные связывания, как вы здесь. – Mat

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