在我2014年末的MacBook Pro上使用Qt 4.8.6
和clang++ x86_64-apple-darwin14.3.0
我发现QsqlTableModel::insertRecord()
无法编写目标MYSQL
数据库:myDB
QSqlDatbase
:myDB
使用非默认连接,例如:
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
答案 0 :(得分:1)
创建QSqlTableModel
(testdb.cpp:35)时,不指定任何数据库连接,因此模型会包装默认连接。这可能不是你想要的,没有经过测试。见documentation