目前的一个项目中,需要使用到三个小的数据库在三个界面中存储对应产品的信息,同时支持在线编辑功能。考虑使用Qt 自带的数据库QSQLITE+QTableView控件实现。
上代码:
/**.h**/
/* 数据库连接类:数据库访问、数据库连接 */
QSqlDatabase sqlDatabase_1;
QSqlDatabase sqlDatabase_2;
QSqlDatabase sqlDatabase_3;
/* 提供从数据库数据到用于数据表示的窗体的映射 */
QSqlTableModel *productModel;
QSqlTableModel *productMode2;
QSqlTableModel *productMode3;
/**1.cpp**/
/* 以 QSQLITE 驱动方式打开或者创建数据库 */
sqlDatabase_1 = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase_1.setDatabaseName("Product1.db");
QSqlQuery query(sqlDatabase_1);
/* 使用指令式创建表 */
query.exec(“”)
productModel = new QSqlTableModel(this);
/* 模型设置表的名字,需要与数据库的表的名字相同 */
productModel ->setTable( "Product1" );
/* 成功则返回 true,查看数据库里是否有这个表格 */
productModel ->select();
/**2.cpp**/
/* 以 QSQLITE 驱动方式打开或者创建数据库 */
sqlDatabase_2 = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase_2.setDatabaseName("Product2.db");
QSqlQuery query(sqlDatabase_2);
/* 使用指令式创建表 */
query.exec(“”)
productMode2 = new QSqlTableModel(this);
/* 模型设置表的名字,需要与数据库的表的名字相同 */
productMode2 ->setTable( "Product2" );
/* 成功则返回 true,查看数据库里是否有这个表格 */
productMode2 ->select();
/**3.cpp**/
/* 以 QSQLITE 驱动方式打开或者创建数据库 */
sqlDatabase_3 = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase_3.setDatabaseName("Product3.db");
QSqlQuery query(sqlDatabase_3);
/* 使用指令式创建表 */
query.exec(“”)
productMode3 = new QSqlTableModel(this);
/* 模型设置表的名字,需要与数据库的表的名字相同 */
productMode3 ->setTable( "Product3" );
/* 成功则返回 true,查看数据库里是否有这个表格 */
productMode3 ->select();
运行界面之后,在执行数据库操作的时候,发现只有Product1.db数据库正常,另两个异常。进一步测试,发现屏蔽任意两个,运行都是正常的,考虑数据库之间冲突了,查找发现:
当多个数据库被创建时,需要指定第二个参数进行区分,否则会报错。所以修改程序:
sqlDatabase_1 = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase_2 = QSqlDatabase::addDatabase("QSQLITE", "sqlite1");
sqlDatabase_3 = QSqlDatabase::addDatabase("QSQLITE", "sqlite2");
重新运行界面,发现只有Product1.db数据库在QTableView中可以显示,其他数据库显示不了。怀疑数据库创建失败,使用query指令创建几条记录。通过SQLiteSpy数据库软件查看数据库内容发现都是正常的,数据库创建成功。
数据库正常,应该为显示过程中有问题,通过qDebug()打印select()函数的返回值,发现返回false,并且行数为0。
bool res = productModel1->select();
int row = productModel1->rowCount();
qDebug()<<"res ="<<res;
qDebug()<<"row ="<<row;
检查发现,QSqlTableModel类如下:
构造函数也带有第二个参数,需要指定,修改程序对应的代码
productModel1 = new QSqlTableModel(this);
productModel2 = new QSqlTableModel(this, sqlDatabase2);
productModel3 = new QSqlTableModel(this, sqlDatabase3);
再次运行界面,操作各个数据库都正常了。
记录自己开过程中遇到的一些坑,非专业人士,欢迎大神补充纠正。