代码之家  ›  专栏  ›  技术社区  ›  drahnr

在Qt中将QSqlRecord提交到MySQL数据库

  •  3
  • drahnr  · 技术社区  · 15 年前

    我想访问一个MySQL数据库,我想在我的Qt/C++程序中从+向数据库读+写数据。对于读写过程,我尝试使用QSqlTableModel、QSqlTableRcord和QSqlDatabase,因为这是一种非常令人愉快的方法,没有太多我出于某种原因(为了处理自己)不喜欢的SQL命令。 我已经在运行一个类似的方法(所以数据库已经在运行),但是它到处都是杂乱的。 因此,简单的问题是,在这几行示例代码中,我做错了什么: 使用qt4.5.x 测试数据库有3列:float x、float y、blob img

    int main(){
    QImage img("./some_image.png");
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("test");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("xxxxxxx");
    if (!db.open() )
        qDebug("Mising db / unable to open");
    else {
        QSqlTableModel model;
        qDebug() << "tables::" <<db.tables(); //so I see the table exists and gets detected
        model.setTable("test_table");
    
        QSqlRecord rec;
        rec.setValue(0,1.0f);
        rec.setValue(1,2.0f);
    
        QByteArray ba;
        QBuffer buffer(&ba);
        buffer.open(QIODevice::WriteOnly);
        img.save(&buffer, "PNG");
        rec.setValue(2,ba);
    
        model.insertRecord(0,rec);
        qDebug() << model.lastError().text();
        if (!model.submitAll())
            qDebug() << "Submit all did not work";
        return 0;
        }
    

    Thx对于任何帮助,我已经从Qt文档的一端运行到另一端,但没有找到解决方案,我已经浪费了5个小时,因此我感谢任何提示(除非您建议完全不同)。

    1 回复  |  直到 15 年前
        1
  •  6
  •   PiedPiper    15 年前

    您的QSqlRecord没有定义任何字段。您需要添加

    rec.append(QSqlField("x", QVariant::Double));
    rec.append(QSqlField("y", QVariant::Double));
    rec.append(QSqlField("img", QVariant::Image));
    

    在设置值之前

        2
  •  0
  •   user2019716    4 年前

    使用您的表生成记录,qt将自动创建表中包含的字段。

    QSqlTableModel table;
    table.setTable("test_table");
    QSqlRecord rcd = table.record();
    rcd.setValue("x",1.0f);
    rcd.setValue("y",2.0f);
    
    QByteArray ba;
    QBuffer buffer(&ba);
    buffer.open(QIODevice::WriteOnly);
    img.save(&buffer, "PNG");
    rcd.setValue("img",ba);
    
    model.insertRecord(-1,rcd);