0

我想用 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);
4

2 回答 2

1

第二个查询是针对另一个连接的(因为您已经通过创建 的其他实例打开了另一个数据库tables),因此您必须获取另一个实例QSqlQuery来执行它。

还要注意您的 sql 命令有语法错误: 之后TABLEINTO您必须放置一个空格以防止将其与表名组合,并且您必须将字符串值放入单引号中:

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指出的声明。谢谢

于 2013-05-16T17:58:24.657 回答
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的(新的)实例。

于 2013-05-16T19:20:08.900 回答