前言支持内置数据库:
一、sqlite
1、在头文件中声明数据库对象
QSqlDatabase db;
2、在构造函数中定义对象(最好这样定义,因为对于db来说只需要addDatabase一次,否则多次addDatabase会报错)
if(QSqlDatabase::contains("qt_sql_default_connection"))
db = QSqlDatabase::database("qt_sql_default_connection");
else
db = QSqlDatabase::addDatabase("QSQLITE");
3、设置数据库文件路径
db.setDatabaseName(".//qtDb.db");//设置数据库文件名字,选择的是当前路径
4、打开数据库
if(!db.open())
{
qDebug() << "打开数据库失败";
return;
}
5、判断数据库中是否存在某表,不存在则新建(数据库指令相关)
QSqlQuery query(db);
bool isTableExist = query.exec("select * from CSSBDB");//关键的判断
if(!isTableExist)//表不存在,新建表
{
创建数据表
if(success)
{
qDebug() <<"数据库表1创建成功!";
}
else
{
qDebug() <<"数据库表1创建失败!";
QSqlError tempErr = query.lastError();
qDebug()<<tempErr;
return;
}
}
6、获取数据库中有多少数据(行数和列数)
query.exec("select * from CSSBDB");
QSqlQueryModel *model = new QSqlQueryModel();
model->setQuery(query);
int nRecordCount = model->rowCount();//行数
int nColumnCount = model->columnCount();//列数
7、获取表的表头内容
if(query.exec("PRAGMA table_info(CSSBDB)"))
{
QStringList tempList;
while(query.next())
{
query.value(1).toString());
}
}
下图是获取表信息结果
8、更新某条记录
update CSSBDB set companyNumber='050689' where id=2
9、插入一条记录
insert into CSSBDB values(null,"台式主机","DELL9020MT","050688","CSB-PC001-A","123","1","3000","2016.4.15","服务器","","")//如果id是null则表示id按顺序增加1
10、关闭数据库
db.close();
二、Access
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "EXPORT_EXCEL");
QString dsn = QString("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=%1").arg(filePath);// DB_PATH
db.setDatabaseName(dsn);//设置数据库路径
QString sqlStr;
if (!db.open())
{
qDebug() << "打开数据库失败";
}
else
{
QSqlQuery query(db);
sqlStr = "";
sqlStr = QString("SELECT * FROM tableName");
query.exec(sqlStr);
}
}
QSqlDatabase::removeDatabase("EXPORT_EXCEL");
ps:
1、query.next(数据库命令)是每次返回一行数据,要取出当前行的某列数据,使用query.value(n),n从0开始
2、判断当前qt可用的数据库驱动
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << "\t" << driver; QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "test");
qDebug() << "ODBC driver valid?" << db.isValid();
3、query.exec,如果sql语句没错,拿它是不会报错的,即时返回值为空,它也没错
4、数据库回收
{
//这里用{}画出一个作用域,当这个域完成之后,数据库的所有操作动作都被回收了
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");//数据库,设置为Access2000
QString dsn = QString("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=%1").arg(DB_PATH);//这是access的数据库,需要与当前电脑数据库驱动一致:控制面板,数据源,ODBC
db.setDatabaseName(dsn);//设置数据库路径
db.open(); //数据库操作
}
QSqlDatabase::removeDatabase("qt_sql_default_connection");//这句话之前保证当前连接的数据库没有任何数据操作,由上面的作用域实现
5、数据库原理:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
上面这句话是新建一个连接,每个连接是对数据库的唯一标识,如果像上面这样写,连接名称就是默认的qt_sql_default_connection,最后回收的时候也是QSqlDatabase::removeDatabase("qt_sql_default_connection")
如果在程序中多个地方【线程】操作数据库:QSqlDatabase db = QSqlDatabase::addDatabase("QODBC","MyConnction");
回收:QSqlDatabase::removeDatabase("MyConnction");
6、有时候出现问题:"[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 QODBC3: Unable to connect"
1、dsn语句有误
2、数据库驱动不正确,当时我编译的是64位的,正常运行,后来改成了32位的,报上面错,下载32位的驱动安装了就ok了
7、解决通过model->rowCount();只能返回最多256个数据
while(model->canFetchMore())
{
model->fetchMore();
}
8、使用了数据库时,有时打包软件出现“driver not load”
1)将C:\Qt\Qt5.3.1\5.3\msvc2012路径下的文件夹plugins复制到exe文件目录下,打开plugins,只保留sqldrivers文件夹,需要确认里面是否有你需要的驱动, 如:程序中使用了QSqlite数据库,则需要有qsqlite.dll(发布版)qsqlited.dll(调试版),
2)在main.cpp文件中添加下面第二行和第三行:
QApplication a(argc, argv);
QString strLibPath(QDir::toNativeSeparators(QApplication::applicationDirPath())+QDir::separator()+"plugins");
a.addLibraryPath(strLibPath);
9、将数据库快速转Excel的办法
sqlStr = "SELECT * INTO [excel 8.0;database=.\\Data\\export\\1.xls].Sheet1 FROM tableName";