Qt+数据库

前言支持内置数据库:

一、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)//表不存在,新建表

{

  bool success = query.exec("create table CSSBDB(id INTEGER PRIMARY KEY,设备名称 varchar,设备型号 varchar,固定资产编号 varchar,测试部自编号 varchar,卡片编号 varchar,数量 varchar,单价 varchar,启用时间 varchar,用途 varchar,使用人或保管人 varchar,备注 varchar)");//创建数据表

  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())

  {

  tempList.append(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";

 

转载于:https://www.cnblogs.com/judes/p/7305953.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值