前言支持内置数据库:

qt QSqlQuery 创建表 postgresql qt创建数据库文件_sql

一、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());
  }
}

下图是获取表信息结果

qt QSqlQuery 创建表 postgresql qt创建数据库文件_Access_02

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";