El uso de la base de datos QT (QSQLITE) (el uso de cuatro transacciones y asuntos que requieren atención)

Transacción de QSqlite (transacción)

Transacción: todas las operaciones en la base de datos se ejecutan o no se ejecutan en absoluto;

1. Determine si su base de datos tiene funciones de transacción:

Después de que la conexión a la base de datos sea exitosa, imprima lo siguiente: resultado verdadero | falso

qDebug() <<"this DB hasFeature:Transaction:" <<db.driver()->hasFeature(QSqlDriver::Transactions);

2. Si es cierto, puede utilizar para abrir:

El valor de retorno aquí también es de tipo bool, puede imprimirlo para ver el resultado verdadero | falso

bool transaction_begin;
transaction_begin= db.transaction();               //开启事务
//打印事务开启结果 bool
qDebug()  << " transaction_begin : "<<transaction_begin ;

ejecución de sentencias sql

La operación general es agregar, eliminar y modificar el objeto real, y la verificación es innecesaria.

query.prepare(QString("INSERT INTO TANLE_NAME("........")");

Después de hacer la inserción anterior, puede enviarlo. Por supuesto, si hay un error en el procedimiento almacenado, debe deshacer rollback (); Commit de nuevo si no hay ningún error;
luego verifique el resultado de la impresión

bool success = query.exec();
query.finish();                                 //资源释放
QSqlError lastError = query.lastError();        //错误信息
if(!success)
{
    
    
     qDebug() << QObject::tr("TANLE add %1 tr lose: ").arg(i) << lastError;
     db.rollback();      //回滚  返回false
     return false;
}
else
{
    
    
      qDebug() << QObject::tr("TEST_RESULT add %1 tr success").arg(i);
}
commit_result = db.commit();        //提交事务
qDebug() << "commit_result---------- : " << commit_result;
db.close();
db.removeDatabase(nmDatabase);

Las anteriores son operaciones normales.

El conocimiento de la operación anterior es una operación, si necesita almacenarse varias veces, si es regular, se permite un bucle for, simplemente agregue un bucle for directamente a la declaración sql, pero si es necesario para operar en clases separadas ( la base de datos es una clase separada, cree esta clase de base de datos en otras clases, y luego llame a la función insert () aquí, y llame a la función insert () aquí cíclicamente), el procesamiento de la transacción no se puede realizar.

Mira el código: llamada de bucle

while (iter != Trss.end())      //用while循环 如果不是结尾就一直添加  并且递增
{
    
    
    userDB->addOneTR(iter.value());
    iter ++;
}

addOneTR () se agrega de la siguiente manera:

for(i = 0;i<TRS.size();i++)
{
    
    
	query.prepare(QString("INSERT INTO TANLE_NAME("........")");
}

La adición de doble ciclo anterior provocará un almacenamiento normal de datos cuando se interrumpa durante la depuración, y el resultado de la impresión será falso.

la razón:

Después de la investigación, las razones son: ①La conexión de la base de datos debe estar conectada antes de que se abra la transacción; ②La base de datos está cerrada, desconectada y debe desconectarse después de la confirmación.
Pero la clase de base de datos aquí es adicional, así que llamo al método de la clase de base de datos al mismo tiempo, y userDB es mi puntero de clase de base de datos.

	//创建连接
    userDB->createConnection2(userDB->nmDatabase);
    //查看是否允许事务的使用
    qDebug() <<"this DB hasFeature:Transaction:" <<userDB->db.driver()->hasFeature(QSqlDriver::Transactions);
    //开启事务
    transaction_begin = userDB->db.transaction();
    //打印事务开启结果 bool
    qDebug()  << " transaction_begin : "<<transaction_begin ;
    
    QMap<int, QVector<TEST_RESULT>>::iterator iter = Trss.begin();  //创建迭代器  是测试结果的第一个值
    qDebug() << " Begin insert One Wpnl PCB Result---------------------" ;

    while (iter != Trss.end())      //用while循环 如果不是结尾就一直添加  并且递增
    {
    
    
        userDB->addOneTR(iter.value());
        iter ++;
    }
    //commit提交事务
    commit_result = userDB->db.commit();
    //打印提交结果
    qDebug()  << " commit_result : "<<commit_result ;

    //关闭数据库
    userDB->db.close();
    //移除连接
    userDB->db.removeDatabase(userDB->nmDatabase);

    qDebug() << Trss.value(0).at(0).barcode << " End insert One Wpnl PCB Result---------------------" ;

Gracias ~~~

Supongo que te gusta

Origin blog.csdn.net/qq_45646951/article/details/109051341
Recomendado
Clasificación