• 5208阅读
  • 6回复

有关Query的问题 [复制链接]

上一主题 下一主题
离线shifan
 
只看楼主 倒序阅读 楼主  发表于: 2009-12-02
dataManager类
有如下声明:
public:
    void prepareRows();
private:
    QSqlQuery *query;
    QString userId;
    QSqlDatabase *dataBase;
构造函数:
dataManager::dataManager(QString id)
        :userId(id)
{
    if(userId.isEmpty()||userId.isNull())
    {
        QMessageBox::information(this,"Fail","Invalid User Id ");
        return;
    }
    dataBase=new QSqlDatabase();
    *dataBase=QSqlDatabase::addDatabase("QSQLITE");
    dataBase->setDatabaseName("data.db");
    if(!dataBase->open())
    {
        qDebug()<<dataBase->lastError();
        QMessageBox::information(this,"Fail","Fail to connect the database");
        return;
    }

    query=new QSqlQuery(*dataBase);
  //  query->clear();
    QStringList existTables;
    existTables=dataBase->tables();

    if(!existTables.contains("user"+userId))
    {
       QString temp=QString("CREATE TABLE IF NOT EXISTS user%1(item INTEGER PRIMARY KEY AUTOINCREMENT,\
                                                               itemDate,\
                                                               itemType,\
                                                               itemField,\
                                                               itemSpecial,\
                                                               itemNumber,\
                                                               itemHandman,\
                                                               itemExtra);").arg(userId);
        if(!query->exec(temp))
        {
            qDebug()<<query->lastError()<<"  type:  "<<query->lastError().type();
            QMessageBox::information(this,"Fail","fail to create tables");
        }
    }

}

成员函数:
void dataManager::prepareRows()
{
    QString temp=QString("SELECT itemDate,\
                            itemType,\
                            itemField,\
                            itemSpecial,\
                            itemNumber,\
                            itemHandman,\
                            itemExtra\
                             FROM user%1;").arg(userId);
    if(!query->exec(temp))                                                      //////////////////////////////////////////////////运行到这里崩溃
    {
        qDebug()<<query->lastError();
        QMessageBox::information(this,"Fail","fail to prepare rows");
    }
}

程序运行到上面标注处程序崩溃。
我想程序崩溃一般是指针的问题,但是构造函数中已经给query符了值,而且是成员变量应该没关系吧。。。
然后可能是没有表user1,但是我在命令行下进入数据库查看确实有表user1,(运行时userId为QString类型的1),
实在不知道怎么回事了,大家帮忙啊~
离线yb824
只看该作者 1楼 发表于: 2009-12-02
构造函数里面query能不能执行??你把prepareRows()放到里面看能不能正常执行,很多方法可以试啊~~
离线shifan
只看该作者 2楼 发表于: 2009-12-02
构造函数中的query可以执行,把prepareRow里面的放到构造函数中也可以执行了。那就是说query这个指针在构造函数外面就失效了,但是为什么会这样呢?我使用new来构造的话,我没有delete应该不会释放空间啊。。。
离线午小夜

只看该作者 3楼 发表于: 2009-12-02
好亂,query.exe(QString("select * from table where name = '%1').arg(name));   只知道如果查詢語句中帶參數的是字符串,要用 ' ' 括起來.如果不是字符串,用arg(name) 是不行的.
[ 此帖被午小夜在2009-12-02 11:23重新编辑 ]
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线午小夜

只看该作者 4楼 发表于: 2009-12-02
QString("SELECT itemDate,\
                            itemType,\
                            itemField,\
                            itemSpecial,\
                            itemNumber,\
                            itemHandman,\
                            itemExtra\
                             FROM user%1;").arg(userId);
這個查詢語句...什麽意思?
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线shifan
只看该作者 5楼 发表于: 2009-12-02
那个查询语句就是在user%1的表中查询上诉的那些列,因为user后面接的字符是可变的,所以用了占位符替换。也就是说很多表有相同的结构,但是表名由相同的前缀和不同的数字组合而成。
[ 此帖被shifan在2009-12-02 19:24重新编辑 ]
离线shifan
只看该作者 6楼 发表于: 2009-12-02
难道QSqlQuery 和QSqlDatabase会在一个函数结束的时候自动清空设置?而不能够把属性带到成员函数中(尽管被设置成成员变量)?跪求这种现象的解释。
快速回复
限100 字节
 
上一个 下一个