我想用Qt创建一个存储类的名称和等级的数据库。我代表一个名为tables
的类。当我运行它时,会发生错误并说“程序意外停止”!!!问题是什么?
我的另一个问题是如何在一个数据库中创建一些表。我应该如何更改我的类(下面的代码)?
database.h:
#ifndef DATABASE_H
#define DATABASE_H
#include <QtSql>
#include <QString>
#include <random>
class tables
{
private:
QString name;
QString table_name;
QSqlDatabase db;
public:
tables(QString);
tables(QString,QString);
void table_completer(int);
QString rand_name();
QString make_string(int);
~tables();
};
tables :: tables(QString nt)
{
table_name = nt;
}
tables :: tables(QString n,QString nt)
{
name = n;
table_name = nt;
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(name);
db.open();
}
QString tables :: rand_name(){
QString a = "abcdefghijklmnopqrstuvwxyz";
QString s = "";
int b = rand()%3 + 4;
for(int i=0;i<b;i++){
int n = rand()%25;
s += a[n];
}
return s;
}
QString tables :: make_string(int num)
{
QString result;
result.append(QString("%1").arg(num));
return result;
}
void tables :: table_completer(int students_numbers)
{
QSqlQuery query;
query.exec("CREATE TABLE"+table_name+"(firstname text,lastname text,math int,physics int,litrature int,chemistry int);");
tables t(name,table_name);
for(int i=0;i<students_numbers;i++){
int a = rand()%20;
QString e = t.make_string(a);
int b = rand()%20;
QString f = t.make_string(b);
int c = rand()%20;
QString g = t.make_string(c);
int d = rand()%20;
QString h = t.make_string(d);
query.exec("INSERT INTO"+table_name+"VALUES("+t.rand_name()+","+t.rand_name()+","+e+","+f+","+g+","+h+")");
}
}
tables :: ~tables()
{
db.close();
}
#endif // DATABASE_H
main:
tables ab("mydatabase.db","class1");
ab.table_completer(30);
答案 0 :(得分:1)
第二个查询用于另一个连接(因为您已经通过创建tables
的其他实例打开了另一个数据库),因此您必须获取另一个QSqlQuery
实例来执行它。 / p>
还要注意你的sql命令有语法错误:在TABLE
和INTO
之后你必须放一个空格来防止它与表名结合,你也必须把字符串值放入单引号:
query.exec("CREATE TABLE "+table_name+"(firstname text,lastname text,math int,physics int,litrature int,chemistry int);");
tables t(name,table_name);
QSqlQuery newQuery;
...
newQuery.exec("INSERT INTO "+table_name+"VALUES('"+t.rand_name()+"','"+t.rand_name()+"',"+e+","+f+","+g+","+h+")");
编辑:我已更正fasked所述的声明。感谢
答案 1 :(得分:1)
创建了与数据库的连接太多。在table
类的构造函数中,使用以下命令与数据库建立连接:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(name);
db.open();
您在table
函数中创建main
类的实例。在table_completer
函数中,您还可以创建table
类的实例。
同样在功能table_completer
中,您可以创建QSqlQuery
。它使用与默认连接名称关联的QSqlDatabase
实例,因为您未明确指定名称。 QSqlDatabase
就像单身人士。由于新连接与旧连接具有相同的名称,因此旧的QSqlDatabase
对象将替换为新对象。 QSqlQuery
仍然存储指向旧QSqlDatabase
的指针,但它已被删除(已销毁) - 因此它将崩溃。
在循环中创建新的QSqlQuery
是有效的,因为它使用有效的QSqlDatabase
(新的)实例。