Erro ao inserir no MySql
-
Pessoal,
Acredito que seja coisa idiota mas não consegui ainda achar meu erro. Seguinte estou pegando os dados do LineEdit e colocando em uma variavel Qstring:
@nome = ui->Campo_nome->text();
end = ui->Campo_end->text();
cep = ui->Campo_cep->text();
cid = ui->Campo_cidade->text();
uf = ui ->combo_UF->currentText();
email = ui->Campo_e_mail->text();
rg = ui->Campo_rg->text();
cpf = ui->Campo_cpf->text();
tel = ui->Campo_tel->text();
cel = ui->Campo_celular->text();
nasc = ui->date_nasc->text();@E tentei converter todos em string e uma int, fiz assim:
@const char *nomes = nome.toStdString().c_str();
const char *ends = end.toStdString().c_str();
ceps = cep.toInt();
const char *cids = cid.toStdString().c_str();
const char *ufs = uf.toStdString().c_str();
const char *emails = email.toStdString().c_str();
const char *rgs = rg.toStdString().c_str();
const char *cpfs = cpf.toStdString().c_str();
const char *tels = tel.toStdString().c_str();
const char *cels = cel.toStdString().c_str();
const char *nascs = nasc.toStdString().c_str();@E depois para testes coloquei a conexão e a execução usei o mesmo arquivo:
@//INSERINDO NO BANCO
QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL" );db.setHostName("localhost"); db.setDatabaseName("otica"); db.setUserName("root"); db.setPassword("will@958"); if( !db.open() ) { qDebug() << db.lastError(); qFatal( "Failed to connect." ); } qDebug( "Connected!" ); QSqlQuery qry; qry.prepare( "INSERT INTO funcionarios (nome,endereco,cep,cidade,uf,email,rg,cpf,tel,cel,dat_nasc) VALUES (nomes,ends,ceps,cids,ufs,emails,rgs,cpfs,tels,cels,nascs)" ); if( !qry.exec() ) qDebug() << qry.lastError(); else qDebug( "Inserted!" );@
E está me dando o seguinte erro:
@
Connected!
QSqlError(1054, "QMYSQL: Unable to execute query", "Unknown column 'nomes' in 'field list'")@Aonde está meu erro que não consegui enxergar ainda!!
-
Aqui:
@ qry.prepare( "INSERT INTO funcionarios (nome,endereco,cep,cidade,uf,email,rg,cpf,tel,cel,dat_nasc) VALUES (nomes,ends,ceps,cids,ufs,emails,rgs,cpfs,tels,cels,nascs)" );@
Você está montando uma String, sem passar as variáveis.
Você precisa fazer bind das variáveis. Ficaria +- assim (código não está completo :-) ):
@ qry.prepare( "INSERT INTO funcionarios (nome,endereco,cep,cidade,uf,email,rg,cpf,tel,cel,dat_nasc) VALUES (? ,?,?,?,?,?,?,?,?,?,?)" );
qry.bindValue( 0, nomes );
qry.bindValue( 1, ends );
qry.bindValue( 2, ceps );
//....
qry.bindValue( 10, cels );
qry.bindValue( 11, nascs );if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
@ -
Olá lima_will,
Um outro enfoque poderia ser:
@ qry.prepare( "INSERT INTO funcionarios (nome,endereco,cep,cidade,uf,email,rg,cpf,tel,cel,dat_nasc) VALUES (:nome, :endereco, :cep, :cidade, :uf, :email, :rg, :cpf, :tel, :cel, :dat_nasc)" );
qry.bindValue( ":nome", nomes );
qry.bindValue( ":endereco", ends );
qry.bindValue( ":cep", ceps );
//....
qry.bindValue( ":cel", cels );
qry.bindValue( ":dat_nasc", nascs );
@Eu o considero melhor apenas por questões de legibilidade.
Um detalhe apenas: A não ser que você tenha uma motivo especial, não
é necessário converter o campo QLineEdit para um const char * antes
de usar no bindValue().
Você pode fazer assim, por exemplo:@qry.bindValue( ":dat_nasc", ui->Campo_nome->text() );@
Veja o protótipo:
@void QSqlQuery::bindValue(const QString & placeholder, const QVariant & val, QSql::ParamType paramType = QSql::In)@
Caso precise fazer alguma consistência no campo antes de gravá-lo,
existem diversas técnicas aplicáveis também. -
Caras,
desculpa a ignorancia mas me surgiu uma nova duvida, na tela que estou trabalhando estou preenchendo uma tabela, com um select simples:
SELECT * FROM clientes;
Funciona mas se tendo colocar algum parametro passado pelo usuario não sei como encaixar no SELECT. Atualmente está assim:
Coloquei a conexão acima em uma classe então chamo ela com o comando:
@Conexao();
Conexao();this->model = new QSqlQueryModel(); if(ui->checkBox_Nome->isChecked()) { opcao = ui->Campo_nome->text().toUpper(); } else if(ui->checkBox_CPF->isChecked()) { opcao = ui->Campo_cpf->text(); } else if(ui->checkBox_RG->isChecked()) { opcao = ui->Campo_rg->text(); } //"SELECT firstname, lastname FROM names WHERE lastname = 'Roe'" model->setQuery("SELECT codCliente,nome,rg,cpf FROM clientes WHERE nome = ?;"); qry.addBindValue(opcao); ui->tableView->setModel(model);@
Sei que não estou usando o @qry@ e sim esse model (segui um tutorial) como faço agora para massar esse parametro opcao para o select???
-
Olá Volnei,
Funcionou perfeitamente ! Muito obrigado!
Acredito que seja minha ultima duvida, agora preciso preencher um combobox, tentei isso aqui:@Conexao();
QString stmtSql = QString("SELECT nome FROM clientes"); int index = 0; while(stmtSql.next()) { ui->comboBox_nome->addItem(stmtSql); index++; }
@
Mas não está dando certo!
-
Oi
Você pode fazer assim por exemplo:
@
QString smtSql = "SELECT nome FROM clientes";comboBox->clear();
QSqlDatabase::database().transaction();
QSqlQuery query;
query.prepare(stmtSql);
query.exec();
if( query.lastError().isValid()) {
QSqlDatabase::database().rollback();
QApplication::restoreOverrideCursor();
return;
}
while( Q_LIKELY(query.next()) )
{
comboBox->addItem( query.value(0).toString() );
}
QSqlDatabase::database().commit();
@É bem divertido usar o Qt com database. :)
-
Volnei,
cara vc é 10!!! funcionou perfeitamente! Muito obrigado mesmo.
Mas poderia me explicar? O outro que você me ensinou a prencheer o tableview eu endenti bem. Mas esse ultimo exemplo ficou um pouco confuso para mim.E outra duvida como faço para pegar os dados de um select e jogar em algumas variaveis, tipo fiz este select:
@Conexao();QSqlQuery qry; qry.prepare("SELECT codCliente FROM clientes WHERE nome= :nome"); qry.bindValue(":nome",cliente); qry.exec(); idCliente = qry.value(0).toInt(); qDebug() << idCliente;@
Só que não está dando certo o que errei??