Qt连接mysql数据库,执行QSQLQuery执行语句的时候程序崩溃

qq_24955197 2016-05-02 12:41:31
我现在用qt做的一个只连接数据库的简单的项目,只是一个查询dialog.cpp和插入数据insert.cpp的两个界面,把数据库单独新建的一个类,用的mysql。现在想从表中查一个数据,可是每次执行dialog的QSqlQuery的执行语句的时候程序就崩溃了,看原因应该是内存溢出了,可是昨天我测试的时候是可以查出来的,而且插入数据是可以的,sql语句也没有问题,是哪里出了问题?!dialog是查询的,insert是插入数据的

database.h:
#ifndef DATABASE_H
#define DATABASE_H

#include <QSqlDatabase>
#include <QtSql>
#include <QtCore>

class Database : public QSqlDatabase
{
public:
Database();
QSqlDatabase db;
};

#endif // DATABASE_H


database.cpp:
#include "database.h"

Database::Database()
{
db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("localhost");
db.setDatabaseName("mydsn_32");

if(db.open())
{
qDebug() << "database opened!";
}
else
{
qDebug() << "Error: " <<db.lastError().text();
}
}

dialog.h:
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QtCore>
#include <QMessageBox>
#include "database.h"
#include "insert.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
Q_OBJECT

public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
bool checkPerson(QString);
bool checkName(QString);
Database tdb;

private slots:
void on_yes_clicked();

void on_no_clicked();

void on_pushButton_clicked();

private:
Ui::Dialog *ui;
QString person;
QString name;
QString sql_person;
QString sql_name;
QSqlQuery qry_person;
QSqlQuery qry_name;
Insert *myinsert;

};

#endif // DIALOG_H

dialog.cpp:
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);

sql_person = "select person from test1";
sql_name = "select name from test1 where person = :name" ;

myinsert = new Insert(this);

tdb.db.open();
}

Dialog::~Dialog()
{
delete ui;
tdb.db.close();
myinsert->deleteLater();
}

void Dialog::on_yes_clicked()
{
person = ui->lineEdit_person->text();
name = ui->lineEdit_name->text();

if(NULL != name || NULL != person)
{
qDebug() << "1";
if(checkPerson(person))//人存在
{
QMessageBox::information(this, "ok", "ok");
if(checkName(name))//名字对应
{
QMessageBox::information(this, "ok", "ok");
}
else
{
QMessageBox::information(this, "no name", "no name");
}

}
else
{
QMessageBox::information(this, "no person", "no person");
}
}
else
{
return;
}
}

void Dialog::on_no_clicked()
{
this->close();
}

bool Dialog::checkPerson(QString userperson)
{
//check person if exsit
qDebug() << "2";
if(qry_person.exec(sql_person))
{
while(qry_person.next())
{
if(qry_person.value(0).toString() == userperson)
{
return true;
}
};
return false;
}
}

bool Dialog::checkName(QString username)
{
qry_name.prepare(sql_name);
qry_name.bindValue("name", person);

if(qry_name.exec())
{
while(qry_name.next())
{
if(qry_name.value(0).toString() == username)
{
return true;
}
};
return false;
}

}

void Dialog::on_pushButton_clicked()
{
myinsert->show();
}

insert.h:
#ifndef INSERT_H
#define INSERT_H

#include <QDialog>
#include "database.h"
#include <QtCore>
#include <QMessageBox>

namespace Ui {
class Insert;
}

class Insert : public QDialog
{
Q_OBJECT

public:
explicit Insert(QWidget *parent = 0);
~Insert();
Database tdb;
bool checkUnq(QString);
bool insertCheck(QString, QString);

private slots:
void on_insert_yes_clicked();
void on_insert_no_clicked();

private:
Ui::Insert *ui;
QString insert_person;
QString insert_name;
QString sql_insert;
QString sql_select;
QSqlQuery qry_insert;
QSqlQuery qry_select;

};

#endif // INSERT_H

insert.cpp:
#include "insert.h"
#include "ui_insert.h"

Insert::Insert(QWidget *parent) :
QDialog(parent),
ui(new Ui::Insert)
{
ui->setupUi(this);

sql_insert = "insert into test1(person, name) values(:person, :name)";
sql_select = "select person from test1";

tdb.db.open();
}

Insert::~Insert()
{
delete ui;
tdb.db.close();
}

void Insert::on_insert_yes_clicked()
{
insert_person = ui->insert_person->text();
insert_name = ui->insert_name->text();

if(NULL != insert_person || NULL != insert_name)
{
if(checkUnq(insert_person))
{
insertCheck(insert_person, insert_name);
QMessageBox::information(this, "ok", "ok");
}
else
{
QMessageBox::information(this, "not only", "not only");
}
}
else
{
return;
}
}

void Insert::on_insert_no_clicked()
{
this->close();
}

bool Insert::checkUnq(QString userperson)
{
//查看是否唯一
if(qry_select.exec(sql_select))
{
while(qry_select.next())
{
if(qry_select.value(0).toString() == userperson)
{
return false;
}
};
return true;
}
}

bool Insert::insertCheck(QString userperson, QString username)
{
//insert data
qry_insert.prepare(sql_insert);
qry_insert.bindValue(":person", userperson);
qry_insert.bindValue(":name", username);

if(qry_insert.exec())
{
return true;
}
return false;
}


...全文
1404 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nongfuxu123 2016-05-08
  • 打赏
  • 举报
回复
引用
这里的人,懂 C 和 mysql 的不多,要不要给你移动到 mysql 区或 C区 ?
就是就是,Mysql的问题写在sql server,放错地方了。
卖水果的net 2016-05-04
  • 打赏
  • 举报
回复
这里的人,懂 C 和 mysql 的不多,要不要给你移动到 mysql 区或 C区 ?
qq_24955197 2016-05-02
  • 打赏
  • 举报
回复
为了使更多的Qt初学者能尽快入门Qt,也为了QtQt Creator的快速普及,我们花费大量精力写出了这一系列教程。虽然教程的知识可能很浅显,虽然教程的语言可能不规范,但是它却被数十万网友所认可。我们会将这一系列教程一直写下去,它将涉及Qt的方方面面 一、Qt Creator的安装和hello world程序的编写 二、Qt Creator编写多窗口程序 三、Qt Creator登录对话框 四、Qt Creator添加菜单图标 五、Qt Creator布局管理器的使用 六、Qt Creator实现文本编辑 七、Qt Creator实现文本查找 八、Qt Creator实现状态栏显示 九、Qt Creator中鼠标键盘事件的处理实现自定义鼠标指针 十、Qt Creator中实现定时器和产生随机数 十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图(七)Qt坐标系统深入 十八、Qt 2D绘图(八)涂鸦板 十九、Qt 2D绘图(九)双缓冲绘图简介 二十、Qt 2D绘图(十)图形视图框架简介 二十一、Qt数据库(一)简介 二十二、Qt数据库(二)添加MySQL数据库驱动插件 二十三、Qt数据库(三)利用QSqlQuery执行SQL语句(一) 二十四、Qt数据库(四)利用QSqlQuery执行SQL语句(二) 二十五、Qt数据库(五)QSqlQueryModel 二十六、Qt数据库(六)QSqlTableModel 二十七、Qt数据库(七)QSqlRelationalTableModel 二十八、Qt数据库(八)XML(一) 二十九、Qt数据库(九)XML(二) 三十、Qt数据库(十)XML(三) 三十一、Qt 4.7.0及Qt Creator 2.0 beta版安装全程图解 三十二、第一个Qt Quick程序(QML程序) 三十三、体验QML演示程序 三十四、Qt Quick Designer介绍 三十五、QML组件 三十六、QML项目之Image和BorderImage 三十七、Flipable、Flickable和状态与动画 三十八、QML视图 三十九、QtDeclarative模块 四十、使用Nokia Qt SDK开发Symbian和Maemo终端软件 四十一、Qt网络(一)简介 四十二、Qt网络(二)HTTP编程 四十三、Qt网络(三)FTP(一) 四十四、Qt网络(四)FTP(二) 四十五、Qt网络(五)获取本机网络信息 四十六、Qt网络(六)UDP 四十七、Qt网络(七)TCP(一) 四十八、Qt网络(八)TCP(二)
QT creator 教程 一、Qt Creator的安装和hello world程序的编写 二、Qt Creator编写多窗口程序 三、Qt Creator登录对话框 四、Qt Creator添加菜单图标 五、Qt Creator布局管理器的使用 六、Qt Creator实现文本编辑 七、Qt Creator实现文本查找 八、Qt Creator实现状态栏显示 九、Qt Creator中鼠标键盘事件的处理实现自定义鼠标指针 十、Qt Creator中实现定时器和产生随机数 十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图(七)Qt坐标系统深入 十八、Qt 2D绘图(八)涂鸦板 十九、 Q t 2D 绘图(九)双缓冲绘图简介 二十、Qt 2D绘图(十)图形视图框架简介 二十一、Qt数据库(一)简介 二十二、Qt数据库(二)添加MySQL数据库驱动插件 二十三、Qt数据库(三)利用QSqlQuery执行SQL语句(一) 二十四、Qt数据库(四)利用QSqlQuery执行SQL语句(二) 二十五、Qt数据库(五)QSqlQueryModel 二十六、Qt数据库(六)QSqlTableModel 二十七、Qt数据库(七)QSqlRelationalTableModel 二十八、Qt数据库(八)XML(一) 二十九、Qt数据库(九)XML(二) 三十、Qt数据库(十)XML (三) 三十一、Qt 4.7.0及Qt Creator 2.0 beta版安装全程图解 三十二、第一个Qt Quick程序(QML程序) 三十三、体验QML演示程序 三十四、Qt Quick Designer介绍 三十五、QML 组件 三十六、QML项目之Image和BorderImage 三十七、Flipable、Flickable 和状态与动画 三十八、QML 视图 三十九、QtDeclarative模块 四十、使用Nokia Qt SDK开发Symbian和Maemo终端软件 四十一、Qt网络(一)简介四十二、Qt网络(二)HTTP编程 四十三、Qt网络(三)FTP(一) 四十四、Qt网络(四)FTP(二) 四十五、Qt网络(五)获取本机网络信 四十六、Qt网络(六)UDP 四十七、Qt网络(七)TCP(一) 四十八、Qt网络(八)TCP(二)
<项目介绍> 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能。 使用教程 本项目为Qt project, 所以推荐使用Qt Creator工具进行构建。 为了使读者更好的在自己的环境上跑通本项目,这里提供我的Qt以及Qt Creator 版本: 如果出现找不到libopencv_XXX450.dll的错误,本项目所有依赖的dll都放在TeleMedicine/debug/目录下,需要将所有dll拷贝到exe文件所在目录: 医生可使用该软件查看患者的电子档案,通过查看CT相片和化验单等数据,为患者写诊断结果, 同时CT相片经过特定的图像处理算法处理后可以更加凸显病灶,提高医生的诊断效率。 使用Qt搭建用户界面,操作数据库以及处理CT相片等图像数据。 通过Qt的Model/View架构完成表单与数据库的联动。 使用MySQL数据库存储患者的病历档案等信息。 使用OpenCV 的图像处理算法完成病灶检测和细胞计数等功能,对CT照片有很好的处理效果。 技术一:OpenCV 病灶检测功能 检测CT相片中的异物,比如肿瘤,将圈出标记。 使用到的技术:opencv中的霍夫圆检测算法 检测流程: 读取图像 灰度化 高斯滤波,除噪,平滑处理 设置霍夫圆检测算法的参数 调用HoughCircles进行圆检测 将检测到的圆在原图中标记显示 细胞计数功能 读取细胞图片 二值化 中值滤波,除噪 Canny边缘检测 漫水填充算法,颜色填充 腐蚀膨胀,进一步除噪 使用findContours函数找寻轮廓 轮廓数就是细胞个数 minEnclosingCircle函数寻找包裹轮廓的最小圆 将圆在原图中画出显示 细胞计数和病灶检测功能的检测效果依赖于参数的设置,因此设置了参数调节窗口。 CT相片处理 对比度和亮度(convertTo函数) 旋转缩放(放射变化,先生成仿射变换矩阵(getRotationMatrix2D),再对图像进行仿射变换(warpAffine)) 滤波除噪(高斯滤波,双边滤波,中值滤波,均值滤波,方框滤波) 阈值处理(threshold函数) 技术二:MySQL数据库 在 5.12 及之前的版本中,Qt 的安装包中自带 MySql 驱动,在 plugins/sqldrivers 目录下可以找到,但到了 5.13 之后,MySql 驱动便没有了,这时我们可以选择手动编译。 下载5.13的源码,手动编译生成dll动态链接库文件,将该文件放入Qt5.13的数据库驱动文件夹中。 Mysql安装流程: 下载压缩包,zip文件 解压之后设置环境变量,将bin文件夹的路径放入 在安装目录中新建一个ini文件,配置端口(3306)、连接数等等 在bin目录下以管理员的身份打开控制窗口,cmd。输入:mysqld --initialize --console, 初始化,初始化之后,会显示本地主机localhost,管理员root,初始化的随机密码。 启动服务:net start mysql 登录数据库mysql -u root -p,输入初始化的密码, 修改密码语句:ALTER USER root@localhost INDENTIFIED BY ’123456’ 删除数据库:musqld --remove mysqlQt中使用mysql数据库: 使用QSQLDatabase的方法addDataBase(“QMYSQL”)添加一个mysql数据库,设置主机名,管理员和密码,数据库名称之后,打开数据库 使用QSqlQuery类(exec,prepare,addBindValue)对数据库增删改查,在exec函数中输入sql语句字符串即可操作数据库。 读入图片:使用QFile类将图片读入,保存为QByteArray字节数组,然后将照片数据封装成QVariant变量,在字符串语句中以问号代替数据,然后使用prepare和addBindValue函数,最后执行插入语句exec 使用QSQLTableModel类和QTableView类,模型视图架构。Model加载数据库中的表格或视图(setTable),然后QTableView设置模型(setModel),即可实现

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧