QSqlTableModel :: insertRecord()失败,QSqlDatabase具有非默认连接名称

时间:2015-05-21 16:01:28

标签: c++ mysql sql qt

在我2014年末的MacBook Pro上使用Qt 4.8.6clang++ x86_64-apple-darwin14.3.0我发现QsqlTableModel::insertRecord()无法编写目标MYSQL数据库:myDB QSqlDatbasemyDB使用非默认连接,例如:

db = QSqlDatabase::addDatabase("QMYSQL","Connection1");

insertRecord(-1,myRecord)评估为false

相反,如果我使用通常的默认连接:

db = QSqlDatabase::addDatabase("QMYSQL");

数据库成功附加为:

mysql> select * from myTable;
+------+------+
| col1 | col2 |
+------+------+
|    1 |    2 |
|    5 |    6 |
+------+------+
2 rows in set (0.00 sec)

容纳多个连接名称的通常建议是使用QSqlQuery构建QSqlDatabase

QSqlQuery query(db)
在这种情况下,显然似乎没有帮助。你能指出什么是缺失的吗?

以下举例说明的少量可运行代码如下:

testdb.h

#ifndef TESTDB_H
#define TESTDB_H

#include <QtSql>
#include <QtCore>


class TestDB
{
public:
    TestDB();
    ~TestDB();
    void dbInit();
    void appendDB(const int &col1, const int &col2);
private:
    QSqlDatabase db;
    QSqlTableModel *model;
};

#endif // TESTDB_H

testdb.cpp

#include "testdb.h"

TestDB::TestDB()
{
    dbInit();
}

TestDB::~TestDB()
{

}

void TestDB::dbInit()
{
    // database connection
    db = QSqlDatabase::addDatabase("QMYSQL","Connection1");
    db.setDatabaseName("myDB"); 
    db.setUserName("root");
    db.setPassword("");
    db.setHostName("localhost");
    db.setConnectOptions();
    if (!db.open())
    {
        qDebug() << "Database error occurred in class: stockinfo" << db.lastError().text();
    }
    QSqlQuery query(db);

    // create database named transactions
    query.exec("CREATE DATABASE IF NOT EXISTS myDB;");
    query.exec("USE myDB;");
    query.exec("CREATE TABLE IF NOT EXISTS myTable("
                   "col1 INT,"
                   "col2 INT"
                   ");");
    model = new QSqlTableModel;
    model->setTable("myTable");
    model->select();
}

void TestDB::appendDB(const int &col1, const int &col2)
{
    QSqlRecord myRecord;
    myRecord.append(QSqlField("col1", QVariant::Int));
    myRecord.append(QSqlField("col2", QVariant::Int));

    myRecord.setValue("col1",col1);
    myRecord.setValue("col2",col2);

    model->insertRecord(-1,myRecord);
    qDebug() << "model->insertRecord(-1,myRecord) = " << model->insertRecord(-1,myRecord);
    qDebug() << "Last Database error: " << db.lastError().text();
}

的main.cpp

#include <QCoreApplication>
#include <testdb.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    TestDB myTestDB;
    myTestDB.appendDB(1,2);
    myTestDB.appendDB(5,6);
    return a.exec();
}

dbTest.pro

QT       += core sql

QT       -= gui

TARGET = dbTest
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp \
    testdb.cpp

HEADERS += \
    testdb.h

1 个答案:

答案 0 :(得分:1)

创建QSqlTableModel(testdb.cpp:35)时,不指定任何数据库连接,因此模型会包装默认连接。这可能不是你想要的,没有经过测试。见documentation