我正在尝试创建一个将数据从 QLineEdit 附加到 SqLite 数据库的函数,问题是,我设法创建数据库和表,但每次我尝试添加实际数据时,程序都会这样做它无法写入数据库,即使实际数据库正在使用中,我也使用 QsqlQuery 中的 prepare() 创建语句,然后使用 bindValue() 添加实际变量,我无法使用 QDebug 它根本不会显示任何内容,这就是我使用太多 QmessageBox() 的原因

欢迎任何想法!

#include "Pantalla_Principal.h" 
#include "ui_Pantalla_Principal.h" 
#include <QWidget> // usar el widget 
#include <QLabel> // usar label 
#include <QObject> 
 
#include <QDebug> // hacer debug 
#include <QSqlError> //hacer debug sql 
 
 
//#include "libusb.h"  // libreria para leer USB 
//#include "../mariadb++/account.hpp"  // crea las conecciones a la base de datos mariadb 
//#include "../mariadb++/connection.hpp" // maneja las conecciones 
#include <QSqlDatabase> // crea conecciones a base de datos 
#include <QSqlTableModel> // tabla de una sola columna 
#include <QSqlRelationalTableModel> // tablas de varias columnas 
#include <QSqlQuery> // hace las busquedas y agrega data a los registros 
#include <QMessageBox> // crea los mensajes de advertencia 
 .... 
 .... 
 .... 
 
void Pantalla_Principal::Nuevo_Registro_Boletas(){ 
    wpp.setupUi(this); 
 
    //obtener info del formulario boletas 
    QString nombre=wpp.Nombre_Prod_edit->text();   
    QString apellido1=wpp.Apellido1_Prod_edit->text(); 
    QString apellido2=wpp.Apellido2_Prod_edit->text(); 
    QString predio=wpp.Predio_Nombre_edit->text(); 
    QString ubicacion=wpp.Predio_Ubicacion_edit->text(); 
    QString chofer=wpp.Nombres_Chofer_edit->text(); 
    QString c_apellido1=wpp.Apellido1_Chofer_edit->text(); 
    QString c_apellido2=wpp.Apellido2_Chofer_edit->text(); 
    QString placas=wpp.Placas_Camion_edit->text(); 
    QString color=wpp.Camion_Color_edit->text(); 
    QString tipo=wpp.Camion_Tipo_edit->text(); 
    QString apellidos = apellido1+" "+apellido2; 
 
  //  variables para MYSQL 
  //  QString host_name="127.0.0.1"; 
    QString name_db="CICLO-OI-19-20.db"; //  Base de Datos del Ciclo 
  //  QString user="root"; 
  //  QString pass="agroindustrias";  // poner el nombre de usuario y pass de acuerdo a la base de datos 
  //  int port=3306; 
 
    //accesa a la base de Datos MariaDB usando QSql 
    if (!QSqlDatabase::isDriverAvailable("QSQLITE")){ 
        QMessageBox::critical( this, "Error de Base Datos", "\n\n El driver SQL no esta disponible"); 
    } 
 
    QSqlDatabase mData=QSqlDatabase::addDatabase("QSQLITE"); // pones el tipo de driver de la db, en este caso QMYSQL 
       mData.setDatabaseName(name_db);  
    //   mData.setHostName(host_name); //pon  el nombre o direccion del host 
    //   mData.setPort(port); // puerto al que llamar 
    //   mData.setUserName(user); 
    //   mData.setPassword(pass);   
 
    if (!mData.open()){ 
        QMessageBox::critical( this, "Error de Base Datos", "\n\nBase de Datos no encontrada"); 
    } 
 
    // llena la base de datos usando QSqlQuery 
    QSqlQuery valor; 
    valor.exec("CREATE TABLE IF NOT EXISTS boletas " 
               "(Folio_Num INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," 
               "Chofer_Nombre VARCHAR(255) NOT NULL, Chofer_Apellidos VARCHAR(255) NOT NULL," 
               "Placas VARCHAR(255) NOT NULL," 
               "Camion_Color VARCHAR(255) NOT NULL, Camion_Tipo VARCHAR(255) NOT NULL," 
               "Peso_Bruto INTEGER NOT NULL, Peso_Tara INTEGER NOT NULL," 
               "Peso_Neto INTEGER NOT NULL, Humedad DOUBLE NOT NULL," 
               "Retenciones DOUBLE NOT NULL, Impuresas DOUBLE NOT NULL )"); 
    if(!valor.exec()){ 
        QMessageBox::warning(this,"Error","\n\n No se pudo crear las tablas"); 
    }else 
        QMessageBox::information(this,"Logro","\n\n Tabla Creada"); 
 
    valor.prepare( "INSERT INTO boletas (Folio_Num, Chofer_Nombre, Chofer_Apellidos, Placas, Camion_Color," 
                   "Camion_Tipo, Peso_Bruto, Peso_Tara, Peso_Neto, Humedad, Retenciones, Impuresas)"  
                   "VALUES (:Folio_Num, :Chofer_Nombre, :Chofer_Apellidos, :Placas, :Camion_Color, :Camion_Tipo," 
                   ":Peso_Bruto, :Peso_Tara, :Peso_Neto, :Humedad, :Retenciones, :Impuresas)" ); 
 
    // valor.prepare( "INSERT INTO boletas (Chofer_Nombre) VALUES (:Chofer_Nombre)");               
    valor.bindValue(":Chofer_Nombre", nombre); 
    valor.bindValue(":Chofer_Apellidos", apellidos); // unir las dos variables 
    valor.bindValue(":Placas", predio); 
    valor.exec(); 
    //QSqlQuery valor; 
    //valor.exec(""); 
 
    if (!valor.exec()){ 
        QMessageBox::warning( this, "Error", "\n \n No se Pudo Guardar"); 
    } 
    else{ 
        QMessageBox::information( this, "Nuevo Registro", "\n \n Se a creado un Nuevo Registro con exito"); 
    } 
 
    mData.close(); 
} 

编辑1:

我像你们告诉我的那样进行了编辑,并为每个占位符添加更多的bindvalue(),如果我直接传递记录的信息而不是来自变量valor.bindValue(":Retenciones", "retencio");,遗憾的是,如果我删除数据库,它不会再次创建数据库,并且一旦创建了记录,我就无法创建任何新记录,除非重新启动程序,我必须使用 2 valor.exec() 以使其正常工作

我退了一步,知道我搞砸了什么吗?

QSqlQuery valor; 
valor.prepare("CREATE TABLE boletas " 
           "(Folio_Num INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," 
           "Chofer_Nombre VARCHAR(255) NOT NULL, Chofer_Apellidos VARCHAR(255) NOT NULL," 
           "Placas VARCHAR(255) NOT NULL," 
           "Camion_Color VARCHAR(255) NOT NULL, Camion_Tipo VARCHAR(255) NOT NULL," 
           "Peso_Bruto INTEGER NOT NULL, Peso_Tara INTEGER NOT NULL," 
           "Peso_Neto INTEGER NOT NULL, Humedad DOUBLE NOT NULL," 
           "Retenciones DOUBLE NOT NULL, Impuresas DOUBLE NOT NULL )"); 
valor.exec(); 
valor.prepare( "INSERT INTO boletas ( Chofer_Nombre, Chofer_Apellidos, Placas, Camion_Color," 
               "Camion_Tipo, Peso_Bruto, Peso_Tara, Peso_Neto, Humedad, Retenciones, Impuresas)"  
               "VALUES (:Chofer_Nombre, :Chofer_Apellidos, :Placas, :Camion_Color, :Camion_Tipo," 
               ":Peso_Bruto, :Peso_Tara, :Peso_Neto, :Humedad, :Retenciones, :Impuresas)" );   
valor.bindValue(":Chofer_Nombre", nombre); 
valor.bindValue(":Chofer_Apellidos", apellidos); // unir las dos variables 
valor.bindValue(":Placas", predio); 
valor.bindValue(":Camion_Color", color); 
valor.bindValue(":Camion_Tipo", tipo); 
valor.bindValue(":Peso_Bruto", "bruto" ); 
valor.bindValue(":Peso_Tara", "tara"); 
valor.bindValue(":Peso_Neto", "neto"); 
valor.bindValue(":Humedad", humedad); 
valor.bindValue(":Retenciones", "retencio"); 
valor.bindValue(":Impuresas", "impuresas"); 
valor.exec(); 

好吧,我确实删除了所有内容并从头开始,问题是两件事:

  1. Qline 每次都编辑它的传递和空字符串
  2. 有一个 if 检查表是否有效并停止准备函数来创建查询

我确实设法通过简化代码来修复sqlite方面,只是为了安全起见,我将所有内容记录到一个文本文件中,qline编辑仍然给我一个空字符串,将尝试检查它

请您参考如下方法:

首先,尝试打印 valor.lastError().text() 以查看错误文本是什么(要使用此成员,应包含 QSqlError)。您的命令中有两个主要问题:

  1. valor.exec() 正在执行两次。我建议删除此行并仅保留 if (!valor.exec()){ 行。
  2. 您在准备命令中提到了 12 个项目,但其中只有三个是绑定(bind)值。

编辑1:

您可以将代码整理如下,并查看哪一行导致错误:

//obtener info del formulario boletas 
    QString nombre= "nombre"; 
    QString apellido1= "apellido1"; 
    QString apellido2= "apellido2"; 
    QString predio= "predio"; 
    QString ubicacion= "ubicacion"; 
    QString chofer= "chofer"; 
    QString c_apellido1= "c_apellido1"; 
    QString c_apellido2= "c_apellido2"; 
    QString placas= "placas"; 
    QString color= "color"; 
    QString tipo= "tipo"; 
    QString apellidos = apellido1+" "+apellido2; 
 
 
      QString name_db="CICLO-OI-19-20.db"; //  Base de Datos del Ciclo 
 
      QSqlDatabase mData=QSqlDatabase::addDatabase("QSQLITE"); // pones el tipo de driver de la db, en este caso QMYSQL 
      mData.setDatabaseName(name_db); 
      if (mData.open()) { 
 
          // llena la base de datos usando QSqlQuery 
          QSqlQuery valor; 
          if (valor.exec("CREATE TABLE IF NOT EXISTS boletas " 
                         "(Folio_Num INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," 
                         "Chofer_Nombre VARCHAR(255) NOT NULL, Chofer_Apellidos VARCHAR(255) NOT NULL," 
                         "Placas VARCHAR(255) NOT NULL," 
                         "Camion_Color VARCHAR(255) NOT NULL, Camion_Tipo VARCHAR(255) NOT NULL," 
                         "Peso_Bruto INTEGER NOT NULL, Peso_Tara INTEGER NOT NULL," 
                         "Peso_Neto INTEGER NOT NULL, Humedad DOUBLE NOT NULL," 
                         "Retenciones DOUBLE NOT NULL, Impuresas DOUBLE NOT NULL )")) { 
 
              //---> Table created successfully ---> Now, insert data 
 
              if (valor.prepare( "INSERT INTO boletas ( Chofer_Nombre, Chofer_Apellidos, Placas, Camion_Color," 
                                 "Camion_Tipo, Peso_Bruto, Peso_Tara, Peso_Neto, Humedad, Retenciones, Impuresas)" 
                                 "VALUES (:Chofer_Nombre, :Chofer_Apellidos, :Placas, :Camion_Color, :Camion_Tipo," 
                                 ":Peso_Bruto, :Peso_Tara, :Peso_Neto, :Humedad, :Retenciones, :Impuresas)" )) { 
 
                  //Query prepared successfully ---> Now, bind values 
                  valor.bindValue(":Chofer_Nombre", nombre); 
                  valor.bindValue(":Chofer_Apellidos", apellidos); // unir las dos variables 
                  valor.bindValue(":Placas", predio); 
                  valor.bindValue(":Camion_Color", color); 
                  valor.bindValue(":Camion_Tipo", tipo); 
                  valor.bindValue(":Peso_Bruto", "bruto" ); 
                  valor.bindValue(":Peso_Tara", "tara"); 
                  valor.bindValue(":Peso_Neto", "neto"); 
                  valor.bindValue(":Humedad", 12); 
                  valor.bindValue(":Retenciones", "retencio"); 
                  valor.bindValue(":Impuresas", "impuresas"); 
 
                  if(valor.exec()){ 
 
                      qDebug() << "data inserted successfully!"; 
                  } else { 
 
                      qDebug() << "Unable to execute query because: " << endl << valor.lastError().text(); 
                  } 
              } else { 
 
                  qDebug() << "Unable to prepare the query because: " << endl << valor.lastError().text(); 
              } 
          } else { 
 
              qDebug() << "Unable to create the table because: " << endl << valor.lastError().text(); 
          } 
 
          mData.close(); 
      } else { 
 
          qDebug() << "Unable to open database because: " << endl << mData.lastError().text(); 
      } 


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!