Db sqlite desde un dialog
-
Puede ser que una db sqlite declarada en los dialogs no funcione???, Porque copié todo el procedimiento de una db que tenía en el mainwindows de otro programa y lo puse en el dialog de otro porque quería manejarla desde ese lugar, va todo bien hasta que tiene que ingresar un usuario, ahí no pasa nada y es el mismo código que uso en la otra....
-
Hola
La forma de acceder a la base de datos es la misma desde cualquier lugar. Puede fallar por una multitud de factores, debes ponernos el código que usas y los errores que te da para que alguien pueda ayudarte.
Un saludo.
-
Acá lo mando:
ciegas.h
#ifndef CIEGAS_H
#define CIEGAS_H#include <mainwindow.h>
#include <QDialog>
#include <QtSql/QSql>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QTableWidgetItem>
#include <QWidget>
#include <QList>namespace Ui {
class Ciegas;
}class Ciegas : public QDialog
{
Q_OBJECTpublic:
explicit Ciegas(QWidget *parent = nullptr);
~Ciegas();int file; void CrearTablaCiegas1(); void MostrarCiegas(); void insertarCiegas(); void on_Ciegas1_itemClicked(QTableWidgetItem *item); void on_modif_clicked(); void on_Delete_clicked(); void on_agregar_clicked();
private:
Ui::Ciegas *ui;
QSqlDatabase db_main;
};#endif // CIEGAS_H
ciegas.cpp
#include "ciegas.h"
#include "ui_ciegas.h"
#include <QDebug>
#include <QWidget>Ciegas::Ciegas(QWidget *parent) :
QDialog(parent),
ui(new Ui::Ciegas)
{
ui->setupUi(this);QStringList titulos; setWindowTitle("Blinds"); QString nombre; nombre.append("db_ciega.sqlite"); db_main = QSqlDatabase::addDatabase("QSQLITE"); db_main.setDatabaseName(nombre); if(db_main.open()){ qDebug()<<"Se ha conectado a la base de datos Ciegadb"; //db_main.close(); }else{ qDebug()<<"ERROR! No se ha conectado a la base de datos Ciegadb"; } CrearTablaCiegas1(); MostrarCiegas();
}
Ciegas::~Ciegas()
{
delete ui;
}void Ciegas::CrearTablaCiegas1()
{
db_main.open();
QString consulta;
consulta.append("CREATE TABLE IF NOT EXISTS Ciegas1("
"Id INTEGER NOT NULL PRIMARY KEY,"
"eid INTEGER,"
"sblind INTEGER,"
"bblind INTEGER,"
"ante INTEGER,"
"time INTEGER,"
"break INTEGER"
")");
QSqlQuery crear;
crear.prepare(consulta);if(crear.exec()){ qDebug()<<"La tabla CIEGAS1 existe o se ha creado correctamente"; }else{ qDebug()<<"La tabla CIEGAS1 NO existe o NO se ha creado correctamente"; qDebug()<<"ERROR!"<<crear.lastError(); }
}
void Ciegas::MostrarCiegas()
{
QString consulta;
consulta.append("SELECT * FROM Ciegas1");
QSqlQuery consultar;
consultar.prepare(consulta);if(consultar.exec()){ qDebug()<<"Se ha consultado correctamente"; }else{ qDebug()<<"NO se ha consultado correctamente"; qDebug()<<"ERROR!"<<consultar.lastError(); } int fila = 0; ui->Ciegas1->setRowCount(0); while(consultar.next()){ ui->Ciegas1->insertRow(fila); ui->Ciegas1->setItem(fila,0,new QTableWidgetItem(consultar.value(1).toByteArray().constData())); ui->Ciegas1->item(fila,0)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); ui->Ciegas1->setItem(fila,1,new QTableWidgetItem(consultar.value(2).toByteArray().constData())); ui->Ciegas1->item(fila,1)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); ui->Ciegas1->setItem(fila,2,new QTableWidgetItem(consultar.value(3).toByteArray().constData())); ui->Ciegas1->item(fila,2)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); ui->Ciegas1->setItem(fila,3,new QTableWidgetItem(consultar.value(4).toByteArray().constData())); ui->Ciegas1->item(fila,3)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); ui->Ciegas1->setItem(fila,4,new QTableWidgetItem(consultar.value(5).toByteArray().constData())); ui->Ciegas1->item(fila,4)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); ui->Ciegas1->setItem(fila,5,new QTableWidgetItem(consultar.value(6).toByteArray().constData())); ui->Ciegas1->item(fila,5)->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); fila++; }
}
void Ciegas::insertarCiegas()
{
QString consulta;
consulta.append("INSERT INTO Ciegas1("
"eid,"
"sblind,"
"bblind,"
"ante,"
"time,"
"break)"
"VALUES("
""+ui->eid1->text()+","
""+ui->sblind1->text()+","
""+ui->bblind1->text()+","
""+ui->ante1->text()+","
""+ui->time1->text()+","
""+ui->brea1->text()+""
")");
QSqlQuery insertar;
insertar.prepare(consulta);if(insertar.exec()){ qDebug()<<"La CIEGA se ha insertado"; }else{ qDebug()<<"La CIEGA NO se ha insertado"; qDebug()<<"ERROR!"<<insertar.lastError(); } ui->eid1->setText(""); ui->sblind1->setText(""); ui->bblind1->setText(""); ui->ante1->setText(""); ui->time1->setText(""); ui->brea1->setText("");
}
void Ciegas::on_Ciegas1_itemClicked(QTableWidgetItem *item)
{
file = item->row();
QTableWidgetItem *Eid = ui->Ciegas1->item(file,0);
QTableWidgetItem *Sblind = ui->Ciegas1->item(file,1);
QTableWidgetItem *Bblind = ui->Ciegas1->item(file,2);
QTableWidgetItem *Ante = ui->Ciegas1->item(file,3);
QTableWidgetItem *Time = ui->Ciegas1->item(file,4);
QTableWidgetItem *Break = ui->Ciegas1->item(file,5);ui->eid1->setText(Eid->text()); ui->sblind1->setText(Sblind->text()); ui->bblind1->setText(Bblind->text()); ui->ante1->setText(Ante->text()); ui->time1->setText(Time->text()); ui->brea1->setText(Break->text());
}
void Ciegas::on_modif_clicked()
{
QString ei = ui->eid1->text();
QString sb = ui->sblind1->text();
QString bb = ui->bblind1->text();
QString an = ui->ante1->text();
QString ti = ui->time1->text();
QString br = ui->brea1->text();QSqlQuery actualizar; actualizar.prepare("UPDATE Ciegas1 SET eid= '"+ei+"', sblind= '"+sb+"', bblind= '"+bb+"', ante= '"+an+"', time= '"+ti+"', break= '"+br+"' WHERE eid = '"+ei+"' " ); actualizar.bindValue(":eid",ui->eid1->text()); actualizar.bindValue(":sblind",ui->sblind1->text()); actualizar.bindValue(":bblind",ui->bblind1->text()); actualizar.bindValue(":ante",ui->ante1->text()); actualizar.bindValue(":time",ui->time1->text()); actualizar.bindValue(":break",ui->brea1->text()); if(actualizar.exec()){ qDebug()<<"El registro se ha modificado"; }else{ qDebug()<<"El registro NO se ha modificado"; qDebug()<<"ERROR!"<<actualizar.lastError(); } ui->eid1->setText(""); ui->sblind1->setText(""); ui->bblind1->setText(""); ui->ante1->setText(""); ui->time1->setText(""); ui->brea1->setText(""); MostrarCiegas();
}
void Ciegas::on_Delete_clicked()
{
QSqlQuery borrar;borrar.exec("DELETE FROM Ciegas1"); if(borrar.exec()){ qDebug()<<"Ciegas1 ha sido borrada"; }else{ qDebug()<<"Ciegas no ha podido ser borrada"; qDebug()<<"ERROR!"<<borrar.lastError(); } MostrarCiegas();
}
void Ciegas::on_agregar_clicked()
{
insertarCiegas();
MostrarCiegas();
}El tema es el siguiente, la base de datos se crea, el problema insertar, porque los mensajes de qDebug van dando todo bien hasta allí, cuando tiene que insertar no pasa nada y no hay mensaje de error, revisé si no tenía algún error en la escritura pero nada....
-
Hola @Casino
Voy a ver si te doy algunas recomendaciones según lo que yo hago y así vamos buscando el problema.
Inicializar la base de datos yo lo hago en el main, antes de abir la ventana principal, así, si no se puede abrir, puedes mostrar un mensaje y salir del programa. Además, como lo tienes, cada vez que abres el diálogo Ciegas estás creando una conexión con la base de datos, haciéndolo en el main solo tendrás una conexión.
Además, para abrir la conexión de doy un nombre a ésta, así es fácil usarla después:
db_main = QSqlDatabase::addDatabase("QSQLITE", "nombre_de_la_conexion");
Y las tablas tendrás que crearlas cuando abres la base de datos en main.
Luego, para referirse a ella en el diálogo Ciegas, usas:
db_main = QSqlDatabase::database("nombre_de_la_conexion");
y luego, cuando uses una query pásale la conexión:
QSqlQuery crear(db_main);
A la hora de preparar las querys yo lo haría aprobechando las facilidades que te da Qt:
QSqlQuery insertar(main_db); insertar.prepare("INSERT INTO Ciegas1(eid, sblind, bblind .....) VALUES (:eid, :sblind, :bblind .....)"); insertar.bindValue(":eid", ui->eid1->text().toInt()); // tienes que pasarle enteros!! insertar.bindValue(":sblind", ui->sblind1->text().toInt()); insertar.bindValue(":bblind", ui->bblind1->text().toInt()); ...... if(insertar.exec()){ qDebug()<<"La CIEGA se ha insertado"; }else{ qDebug()<<"La CIEGA NO se ha insertado"; qDebug()<<"ERROR!"<<insertar.lastError(); }
Normalmente si hay algún error suele mostrar un mensaje en la consola. Intenta aplicar algunos cambios a ver, luego intentaré darle un repaso mas a fondo a ver si encuentro algún problema.
PD:
Revisando la parte de actualizar me di cuenta de una cosa, los campos de la base de datos son de tipo INTEGER, así que cuando haces bindValue tienes que pasarle un entero, y le estás pasando un String (que es lo que devuelve text()))Esta consulta la tienes incorrecta, es decir, al crear la consulta ya le estás pasando el valor de cada campo, por lo que no tienes que llamar a bindValue después:
actualizar.prepare("UPDATE Ciegas1 SET eid= '"+ei+"', sblind= '"+sb+"', bblind= '"+bb+"', ante= '"+an+"', time= '"+ti+"', break= '"+br+"' WHERE eid = '"+ei+"' " ); actualizar.bindValue(":eid",ui->eid1->text()); actualizar.bindValue(":sblind",ui->sblind1->text());
modifícala como te puse arriba a ver si no te da error, y pásale un entero, no un String.
Un saludo