找回密码
 立即注册
收起左侧
楼主: yafeilinux

第22篇 数据库(二)编译MySQL数据库驱动

106
回复
71984
查看
[复制链接]
累计签到:1962 天
连续签到:10 天
2016-10-13 09:37:02 显示全部楼层
tmac 发表于 2016-10-8 10:05
为啥我的安装目录找不到mysql文件呢,求助,小弟qt4.7的

在src文件目录下,存储源码的地方!
回复 支持 反对

使用道具 举报

累计签到:5 天
连续签到:1 天
2016-12-6 20:54:29 显示全部楼层
libmysql.dll文件复制到bin目录下还是出现和上一步一样的错误,无法打开数据库
回复 支持 反对

使用道具 举报

累计签到:8 天
连续签到:1 天
2016-12-9 12:26:17 显示全部楼层
Qt5.5版本只需把mysql中的libmysql.dll文件复制到Qt bin目录下,可有一个问题,Qt不支持MYSQL的事务  
回复 支持 反对

使用道具 举报

累计签到:30 天
连续签到:1 天
2017-2-2 19:16:51 显示全部楼层
请问老师我为什么找不到这个pro文件啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2017-2-2 23:41:53 显示全部楼层
Z_bin 发表于 2017-2-2 19:16
请问老师我为什么找不到这个pro文件啊

Qt5不需要手动编译的,这个插件已经有了
回复 支持 反对

使用道具 举报

累计签到:38 天
连续签到:1 天
2017-2-25 15:43:50 显示全部楼层
亚飞老师您好,我现在用sqlite数据库,在fedora 虚拟机QT creator上编译桌面版测试程序,能够正常运行,打印数据库信息,但是将这个程序交叉编译之后下载到板子上就无法运行,卡在
  1. if(!db.open())
  2.     {
  3.         return false;
  4.     }
复制代码

所以目测是板子上没有sqlite的驱动,但是在板子上执行SQLite3 -version 会打印版本信息
C:\Users\Torres\Desktop
所以请问亚飞老师我应该怎么加载sqlite的驱动呀?

完整测试代码为
  1. #include <QtCore/QCoreApplication>
  2. //#include "database.h"
  3. #include<QtSql>
  4. #include <QSqlDatabase>
  5. #include <QDebug>
  6. #include <QSqlQuery>
  7. #include <QStringList>
  8. int main(int argc, char *argv[])
  9. {
  10.      QCoreApplication a(argc, argv);
  11.      QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
  12.     //添加数据库驱动
  13.      QStringList drivers = QSqlDatabase::drivers();
  14.          foreach(QString driver, drivers)
  15.             qDebug() << driver;
  16.     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  17.     //设置数据库名称
  18.     db.setDatabaseName(":memory:");qDebug()<<"inserted!1";
  19.     //打开数据库
  20.     if(!db.open())
  21.     {
  22.         return false;
  23.     }

  24.     //以下执行相关sql语句
  25.     QSqlQuery query;

  26.     //新建student表,id设置为主键,还有一个name项
  27.     query.exec("create table student(id int primary key,name varchar)");

  28.     //向表中插入3条记录
  29.     query.exec("insert into student values(1,'xiaogang')");
  30.     query.exec("insert into student values(2,'xiaoming')");
  31.     query.exec("insert into student values(3,'xiaohong')");

  32.     //查找表中id >=2 的记录的id项和name项的值
  33.     query.exec("select id,name from student where id >= 2");

  34.     //query.next()指向查找到的第一条记录,然后每次后移一条记录
  35.     while(query.next())
  36.     {
  37.         //query.value(0)是id的值,将其转换为int型
  38.         int value0 = query.value(0).toInt();
  39.         QString value1 = query.value(1).toString();
  40.         //输出两个值
  41.         qDebug() << value0 << value1 ;
  42.     }

  43.     return a.exec();
  44. }
复制代码
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2017-2-25 21:42:04 显示全部楼层
liana07151018 发表于 2017-2-25 15:43
亚飞老师您好,我现在用sqlite数据库,在fedora 虚拟机QT creator上编译桌面版测试程序,能够正常运行,打 ...

需要交叉编译sqlite库。
回复 支持 反对

使用道具 举报

累计签到:38 天
连续签到:1 天
2017-2-27 10:40:04 显示全部楼层
yafeilinux 发表于 2017-2-25 21:42
需要交叉编译sqlite库。

谢谢您的回复
我是交叉编译了sqlite库的,并且把交叉编译之后的/bin目录下的sqlite3,lib目录下的libsqlite3.so,libsqlite3.so.0,libsqlite3.0.8.6都分别拷贝到了开发板相应的目录/bin,和/lib下,也将原有交叉编译的QTEmbedded库下的plugins都拷贝到了开发板对于qt/plugins目录。。。
用gdb调试上述测试程序:
打印出当程序执行到db.open时发生:
Program received signal SIGILL, Illegal instruction.
0xb69c4544 in ?? () from /usr/local/qt/plugins/sqldrivers/libqsqlite.so
其中/usr/local/qt/plugins就是开发板上的目录
回复 支持 反对

使用道具 举报

累计签到:38 天
连续签到:1 天
2017-2-27 15:05:45 显示全部楼层
yafeilinux 发表于 2017-2-25 21:42
需要交叉编译sqlite库。

中午在开发板上试了一下shell下执行命令创建数据库如图:
C:\Users\Torres\Desktop\捕获8.JPG

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

累计签到:38 天
连续签到:1 天
2017-2-27 18:12:31 显示全部楼层
本帖最后由 liana07151018 于 2017-2-27 18:28 编辑
yafeilinux 发表于 2017-2-25 21:42
需要交叉编译sqlite库。

一天的测试现在是这样:
对下述示例程序交叉编译生成可执行文件到开发板上;
  1. #include<stdio.h>
  2. #include"/usr/include/sqlite3.h"
  3.    static int callback(void *NotUsed, int argc, char **argv, char **azColName)
  4.   {
  5.      int i;
  6.       for(i=0; i<argc; i++)
  7.       {
  8.          printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  9.       }
  10.      printf("\n");
  11.      return 0;
  12.    }
  13. int main(int argc, char **argv)
  14. {
  15.    sqlite3 *db;
  16.    char *zErrMsg = 0;
  17.    int rc;
  18.    if( argc!=3 )
  19.    {
  20.      fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
  21.    }
  22.    rc = sqlite3_open(argv[1], &db);

  23.    if( rc )
  24.    {
  25.       fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  26.       sqlite3_close(db);
  27.    }
  28.    rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  29.    if( rc!=SQLITE_OK )
  30.    {
  31.      fprintf(stderr, "SQL error: %s\n", zErrMsg);
  32.    }
  33.    sqlite3_close(db);
  34.    return 0;
  35. }
复制代码

编译命令为:arm-linux-gnueabihf-gcc -lrt -O3 -o sql_test1.o logic_test_20130111.c -lsqlite3 -I /home/troy/yb/Sqlite_arm/include -L /home/troy/yb/Sqlite_arm/lib
添加的目录都是交叉编译sqlite库后的路径;
在开发板上执行效果如下图所示

也就是说开发板上的sqlite环境是配置好了的,但是在QTCreator中调用QSQL模块用户接口类的接口函数比如db.open就出现上述错误。
如果亚飞老师知道问题所在,或者有相关链接和文档,万分感谢!这个问题弄了好久了,网上讲的大部分是Sqlite的移植和配置,并没有我这样类似的问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2017-2-27 23:56:20 显示全部楼层
liana07151018 发表于 2017-2-27 18:12
一天的测试现在是这样:
对下述示例程序交叉编译生成可执行文件到开发板上;

你用什么版本的Qt,用什么开发板?
回复 支持 反对

使用道具 举报

累计签到:38 天
连续签到:1 天
2017-2-28 11:55:12 显示全部楼层
yafeilinux 发表于 2017-2-27 23:56
你用什么版本的Qt,用什么开发板?

QT4.8.2
开发板是启扬公司的SAMA5D3系列,ARM-cortex A5
谢谢您的回复
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2017-3-1 17:29:44 显示全部楼层
liana07151018 发表于 2017-2-28 11:55
QT4.8.2
开发板是启扬公司的SAMA5D3系列,ARM-cortex A5
谢谢您的回复

嗯,流程应该没有错,只是嵌入式开发板环境各不相同,所以有些功能还是需要根据自己的情况进行测试。
回复 支持 反对

使用道具 举报

累计签到:38 天
连续签到:1 天
2017-3-1 18:38:00 显示全部楼层
yafeilinux 发表于 2017-3-1 17:29
嗯,流程应该没有错,只是嵌入式开发板环境各不相同,所以有些功能还是需要根据自己的情况进行测试。 ...

谢谢!
现在我的应用程序都是直接调用sqlite_open,sqlite_exec这些API函数直接操作数据库了,因为调用QtSQL模块提供的用户接口类函数open()的时候出现illegal instruction,
说说我的qt全程配置过程吧;
qt_arm版本在交叉编译的时候加了选项-qt-sql-sqlite,
编译完成之后在$QTDIR/plugins/sqldrivers目录下有libqsqlite.so文件
将这个plugins目录拷贝到了开发板对应qt/目录下
交叉编译sqlite库文件的时候,生成的lib目录下的文件也拷贝到了开发板的/lib下,并且设置好了环境变量
然鹅……………………
通过调用sqlite_open等接口函数实现的应用程序通过在.pro下添加
LIBS += -L/home/troy/yb/Sqlite_arm/lib -lsqlite3(/home/troy/yb/Sqlite_arm是交叉编译sqlite库时的文件夹)
INCLUDEPATH +=-I/home/troy/yb/Sqlite_arm/include
这样的话了,数据库测试程序没问题,
但是当应用程序调用情况如下
  1. QCoreApplication::addLibraryPath("./plugins");
  2.      QCoreApplication a(argc, argv);
  3.    //  QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
  4.     //添加数据库驱动
  5.      QStringList drivers = QSqlDatabase::drivers();
  6.          foreach(QString driver, drivers)
  7.             qDebug() << driver;
  8.     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  9.     //设置数据库名称
  10.     db.setDatabaseName("memory.db");qDebug()<<"inserted!1";
  11.     //打开数据库
  12.     if(!db.open())
  13.     {
  14.         qDebug()<<db.lastError();
  15.         return false;
  16.     }
复制代码

打印信息就出来这样:
"QSQLITE"
inserted!1
Illegal instruction
——————————————
如果亚飞老师有经验或者看帖的大神有方法解决 望不吝赐教!!!哎~虽然用接口函数可以操作数据库但是还是不如qtsql封装的用户接口类调用起来好使啊。各种视图什么的
回复 支持 反对

使用道具 举报

累计签到:30 天
连续签到:1 天
2017-3-10 23:44:16 显示全部楼层
近日我在学习Qt数据库的时候,发现教材上的例程无法实现, 打印了一下可用的驱动发现只有QPSQL7,然而在调用该驱动时,也是无法调用。最后我网上下载了MySQL数据库,按照网上的配置,发现都是不行的,网络上每一个帖子我都试了,可是每一个帖子感觉都是不行的。不知道该如何是好。在此我想请问大家是如何用Qt5.8调用MySQL的,或者其他数据库也行。小弟的心实在是累了。
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2017-3-11 18:07:37 显示全部楼层
核心科技 发表于 2017-3-10 23:44
近日我在学习Qt数据库的时候,发现教材上的例程无法实现, 打印了一下可用的驱动发现只有QPSQL7,然而在调 ...

什么系统?
回复 支持 反对

使用道具 举报

累计签到:30 天
连续签到:1 天
2017-3-11 19:04:31 显示全部楼层

Win7 64位旗舰版,我下载的Qt5.8 x86的,MySQL32位的和64位的我都试过了,可是都不行啊。
回复 支持 反对

使用道具 举报

累计签到:30 天
连续签到:1 天
2017-3-11 19:05:02 显示全部楼层

而且,我安装Qt5.8的时候,源码包我也安装了。
回复 支持 反对

使用道具 举报

累计签到:1568 天
连续签到:1 天
2017-3-11 21:52:02 显示全部楼层
核心科技 发表于 2017-3-11 19:04
Win7 64位旗舰版,我下载的Qt5.8 x86的,MySQL32位的和64位的我都试过了,可是都不行啊。 ...

应该不会啊。你去下载页面下载《Qt Creator快速入门》第3版实验讲义,里面有详细的MySql安装使用步骤。
回复 支持 反对

使用道具 举报

累计签到:11 天
连续签到:1 天
2017-4-26 14:40:26 显示全部楼层
为什么我按照《Qt Creator快速入门》第3版实验讲义里安Mysql,然后结果是:
failed to connect to root mysql admin 呢??
我的qt 是5.6版本的,按理说不应该呀,我的mysql 也可以创建数据库的啊,他们两个都是32位的啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了