2017-05-27 101 views
0

我正在嘗試編寫一段代碼,它將從QTableView中獲取所選項目並將其從數據庫中刪除。無查詢無法獲取行

QModelIndex index = ui->tableView->selectionModel()->currentIndex(); 

QString value= ui->tableView->model()->data(index).toString(); 
qDebug() << "Value : " << value; 

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName("TestDatabase.db"); 

if(!db.open()) 
{ 
    qDebug() << db.lastError(); 
    qFatal("Failed to connect"); 
} 
QSqlQuery qry; 
qry.prepare("DELETE * FROM movies WHERE Title='"+value+"'"); 

if(!qry.exec()) 
{ 
    QMessageBox::critical(this, tr("error::") , qry.lastError().text()); 

} 

db.close(); 

但是,我得到'沒有查詢無法獲取行'錯誤。如果你能幫我解決這個問題,我會很感激。

更新:問題是我在DELETE後放置了'*'。

回答

1

由於您使用的是不正確的prepare(),您的代碼遭受SQL注入攻擊。這也是你得到錯誤的原因。要正確使用prepare(),必須至少跟一個bindValue()。你的情況是這樣的:

QSqlQuery qry; 
qry.prepare("DELETE * FROM movies WHERE Title = :title"); 
qry.bindValue(":title", value); 
if(!qry.exec()) //... 

bindValue()需要照顧value正確逃了出來,沒有做任何傷害。

...如果您認爲SQL注入不是問題,請與Bobby Tables聯繫:)