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&#40;&#41; &#41;
         qDebug(&#41; << qry.lastError(&#41;;
       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,

    Muito obrigado depois que vi as respostas o mundo mudou! rssrsrrs

    Valeu mesmo pela ajuda!!



  • 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á lima_will,

    Você pode de maneira geral usar esta simples técnica:

    @
    QString stmtSql = QString("SELECT codCliente,nome,rg,cpf FROM clientes WHERE nome = '%0'").arg(opcao);

    model->setQuery(stmtSql);
    ui->tableView->setModel(model);
    @



  • 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&#40;&#41;;
    idCliente = qry.value(0).toInt();
    
    qDebug() << idCliente;@
    

    Só que não está dando certo o que errei??


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.