我现在用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_OBJECTpublic:
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_Hdialog.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_OBJECTpublic:
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_Hinsert.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;
}
#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_OBJECTpublic:
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_Hdialog.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_OBJECTpublic:
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_Hinsert.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;
}
解决方案 »
- 主键的疑惑
- 9万条数据,用select*全部查询mysql数据库,数度超级慢,求解。
- txt文档导入MySQL出现的问题.
- navicat能控制MySQL开关吗
- 关于mysql innodb 数据的恢复问题
- mysqlroot密码丢失问题
- 关于MySQL建立数据库和调用数据库的请教!!!急!!!!!!!!!!!!!!!!!!
- mysql4数据导入mysql5乱码问题~帮顶有分~
- 请yigeyigeyige(怡戈)进来,谈论mysql同步问题,谢谢
- 请问对于一个频繁有着INSERT和DELETE操作的SQL表,在建表或者SQL查询时需要注意哪些问题?
- Mysql多表查询问题
- 关于mysql存储过程的问题
就是就是,Mysql的问题写在sql server,放错地方了。