• 11401阅读
  • 4回复

关于在Sqlite中创建表的程序 [复制链接]

上一主题 下一主题
离线shifan
 
只看楼主 倒序阅读 楼主  发表于: 2009-12-01
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
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);
    QStringList existTables;
    existTables=dataBase->tables();

    if(!existTables.contains(userId))
    {

        query->prepare("CREATE TABLE :tableName IF NOT EXISTS (item INTEGER PRIMARY KEY AUTOINCREMENT ASC,itemDate,itemType,itemField,itemSpecial,itemNumber,itemHandman,itemExtra)");                              ////////////////////////////error
        query->bindValue(":tableName",userId);
        if(!query->exec())
        {                                                                                                                                                                  /////////////////////总是进入这个条件分支。
            qDebug()<<query->lastError()<<"  type:  "<<query->lastError().type();
            QMessageBox::information(this,"Fail","fail to create tables");
        }
    }

以上这段代码创建以userId命名的表(如果没有的话),但是运行时总是无法创建成功,总是进入上面标注的条件分支。
输出的错误信息如下:
QSqlError(-1, "Parameter count mismatch", "")   type:   2
说是执行的语句的符号问题,我检查了N遍,也没有查出哪里错了,大侠们帮帮忙啊!
离线shifan
只看该作者 1楼 发表于: 2009-12-01
基本上可以确定错误出在这里:
query->prepare("CREATE TABLE :tableName IF NOT EXISTS (item INTEGER PRIMARY KEY AUTOINCREMENT ASC,itemDate,itemType,itemField,itemSpecial,itemNumber,itemHandman,itemExtra)");                              ////////////////////////////error
我发现了一处错误将语句改为
query->prepare("CREATE TABLE  IF NOT EXISTS  :tableName(item INTEGER PRIMARY KEY AUTOINCREMENT ASC,itemDate,itemType,itemField,itemSpecial,itemNumber,itemHandman,itemExtra)");        
但是还是不行。
后来我又发现表明不能直接使用数字,就算是字符串类型表示的数字,但还是不行。
很奇怪的是就在:吧:tableName改为user1是可以的,
但是使用bindValue,将:tableName替换成"user"+userId就不行 ,其中userId是QString类型,值为1
求大侠帮帮忙。。。。。。
离线shifan
只看该作者 2楼 发表于: 2009-12-01
后来我又试了其他的方法,发现只有使用bindValue是不好使的。
使用arg来提前准备一个字符串,然后exec(String);是可以的。
直接在()中使用(“text1”+userId+“text2”)也是可以的。很想
知道为什么?希望大侠不吝赐教。。。
离线skykingf

只看该作者 3楼 发表于: 2013-01-18
都没有知道的啊?
离线realfan

只看该作者 4楼 发表于: 2013-01-19
bindValue是用于绑定字段的吧,绑定表名还真没见过
快速回复
限100 字节
 
上一个 下一个