作者:嘉信永顺_232 | 来源:互联网 | 2023-02-08 20:35
就关于qt连接使用sqlite折腾了一晚上.倒也不全是因为数据库连接的问题,主要还是数据格式各自出问题.原来的数据库是access,为了导入linux下的sqlite,我把其输出格式改成了x
就关于qt连接使用sqlite折腾了一晚上.倒也不全是因为数据库连接的问题, 主要还是数据格式各自出问题.
原来的数据库是access, 为了导入linux下的sqlite, 我把其输出格式改成了xml文档. 然后在qt中对其进行解析.
// QDomElement docElem = doc.documentElement();
// //QDomNode n = docElem.firstChild();
// QDomNodeList list = doc.elementsByTagName(QString("Row")).at(0).toElement().childNodes();
// QString s = "";
// for(int i=0; i
以上获得的是表的字段, 通过获得的字符串我直接在命令行里创建了一个表.
然后就是数据的添加了.
首先新建一个connection.h头文件
#ifndef CONNECTION_H
#define CONNECTION_H
#include
#include
#include
#include
static bool createConnection(){
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("/home/hao/Dangers/Danger.db");
if(!db.open()){
qDebug() <<"aaaa";
QMessageBox::critical(0,"Cannot open database",
"unable to establish a database connection.", QMessageBox::Cancel);
return false;
}
return true;
}
#endif // CONNECTION_H
当然工程要加上
QT += core gui sql xml
然后就是在main.cpp进行操作了
#include
#include
#include
#include
#include
#include
#include
#include "connection.h"
#include
int main(int argc, char * argv[]){
QApplication a(argc,argv);
qDebug() << QDir::currentPath();
QDomDocument doc;
QFile file("../database/important.xml");
if(!file.open(QIODevice::ReadOnly)) {
qDebug() <<"open failed";
return 0;
}
if(!doc.setContent(&file)){
file.close();
return 0;
}
file.close();
if(!createConnection()) {
qDebug() <<"connection failed";
return 1;
}
QSqlQuery query;
QDomElement docElem = doc.documentElement();
QDomNodeList list = doc.elementsByTagName(QString("Row"));
for(int i=1; i){
QString s = "";
int index = 1;
QDomNodeList attrs = list.at(i).childNodes();
for(int j=0; j){
if(attrs.at(j).toElement().attribute(QString("ss:Index"))!=""){ //这里处理费了一阵功夫,因为这个xml文档中,当有些字段为空时,它会直接加一个index的标示符,而之前的就不生成节点了.
while(index "ss:Index")).toInt()){
s = s+"\'" + "\'" + ",";
index ++;
}
}
index ++;
s += '\''+attrs.at(j).toElement().text()+'\'';
if(index<=96){
s += ',';
}
}
while(index <= 96){ //一共有96个字段
s = s+ "\'" + "\'";
if(index !=96){
s+=",";
}
index++;
}
QString sr = "insert into tablename values("+s+")";
query.exec(sr+";");
qDebug() <<"--------------------------------";
qDebug() << qPrintable(sr);
}
qDebug() << list.length();
return a.exec();
}
/********2016.8.25更新********************/
研究了一上午, 写了一个连接数据库的模板类.
之后当然会有更多的扩充
/*******connectdb.h***********/
#ifndef CONNECTDB_H
#define CONNECTDB_H
#include
#include
#include
#include
#include
class ConnectDB
{
public:
ConnectDB(QString dbname="database.db
");
//ConnectDB();
~ConnectDB();
QSqlDatabase db;
QSqlQuery select(QString sql);
void getSubstance(QComboBox *box);
};
#endif // CONNECTDB_H
/****************connectdb.cpp*************/
#include "connectdb.h"
#include
ConnectDB::ConnectDB(QString dbname)
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(dbname);
if( !db.open() ){
QMessageBox::critical(0, "Cannot open database",
"Unable to establish a database connection.", QMessageBox::Cancel);
}
}
ConnectDB::~ConnectDB(){
}
QSqlQuery ConnectDB::select(QString sql){
QSqlQuery query;
query.exec(sql);
return query;
}
//这个函数作用是获取数据库中的物质名称填充到组件的comboBox中去
void ConnectDB::getSubstance(QComboBox *box){
QString sql = "select 中文名称 from tablename order by id";
QSqlQuery query = this->select(sql);
while(query.next()){
QString item = query.value(0).toString();
box->addItem(QString(item));
}
}
/**********调用方法************/
#include "connectdb.h"
......
ConnectDB *db = new ConnectDB();
ComboBox *nameSelect = new QComboBox;
db->getSubstance(nameSelect);