• 7663阅读
  • 3回复

令人糊涂的QSqlQuery的奇怪问题!! [复制链接]

上一主题 下一主题
离线xiaochunz
 

只看楼主 倒序阅读 楼主  发表于: 2008-12-01
令人糊涂的QSqlQuery的奇怪问题!!
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
用事务功能一次性insert到harm表50条数据,其中时间和数组的index为联合主键,如 09:20:45 和1,09:20:45 和2,……09:20:45 和50执行错误时对话框弹出sql语句字符串

  db.transaction ();//db是一个已定义的QDatabase对象
  QSqlQuery query;
    QString sql_harm = QString("insert into harm values('" + now.toString(Qt::LocaleDate) + "',");  /* 已定义的QDateTime  对象,now.currentDateTime ();*/ 
    for(int s = 0; s < 50; s++)
    {
        QString sql = QString("%1, %2, %3)");
        sql =sql.arg(s + 1);
        sql =sql.arg(*(arry_U+s)); //arry_U arry_I是50维数组
        sql =sql.arg(*(arry_I+s));
       
        sql =sql_harm + sql;
        if(!query.exec(sql))
          {
            QMessageBox msgBox;
            msgBox.setDetailedText (sql) ;
            msgBox.exec();
        }
    }
    db.commit();



令人糊涂的是,注意红色语句,无论if(!query.exec(sql)还是if(query.exec(sql),都会弹出对话框。
更纳闷的是,if(!query.exec(sql)会弹出50个对话框,好似50个添加都错误,但我用显示的时间来select时,如:   
QString mm("select * from harm where datetime = '2008-12-1 9:48:29'");
query.exec(mm);   
while(query.next())
      ii++;  结果i = 50,证明添加是完全成功。

反过来用if(query.exec(sql)  ,还是有对话框弹出,而且还不止50个,反复出现,远大于50。估计应该是会出现50次重复出现,供2500个。好像是添加错误,自动重新执行了。再select得到记录为 0条

有两点糊涂:
1,同样的数据,怎么if(!query.exec(sql)和if(query.exec(sql)都有对话框弹出??[/color]而且返回false的,添加数据是正常的,ture反而是失败的???

2,用if(query.exec(sql)时,对话框远远>50个,QSqlQuery 好像自动rollback了(绝对没有人为写rollback或重复执行的代码),重复执行了,糊涂!!

望得到帮助和提示,先谢谢!
[ 此贴被xiaochunz在2008-12-01 21:09重新编辑 ]
离线xiaochunz

只看该作者 1楼 发表于: 2008-12-02
今天再次测试上面的程序,不知是我昨天不仔细,还是什么怪原因,今天现象改变了:

修改程序如下,测试
bool si =query.exec(sql);
      if(si)
            ……
使用if(!si)时,也就是判断执行错误时,100个对话框会重复出现
使用if(si)时,对话框出现150次

当我仍用if(query.exec(sql)和if(!query.exec(sql),对话框都是出现150次,而且数据添加好像都是正常的,每50个之间的datatime相隔1s

实在太奇怪了?!
[ 此贴被xiaochunz在2008-12-02 09:24重新编辑 ]
离线wvins
只看该作者 2楼 发表于: 2008-12-02
while(query.next())
      ii++;  结果i = 50,证明添加是完全成功。
不一定是插入成功吧。

建议你看看lastError()
离线xiaochunz

只看该作者 3楼 发表于: 2008-12-02
谢谢!

发现部分原因了。因为insert是定时3min进行一次的,后来为了缩短调试等待时间,我将其改为0.5s就insert一次,将时间延长后,就无错误了。

有点疏忽,让各位也犯糊涂了,抱歉!!

这证明,数据库tranaction的insert代码本身是没有问题了,错误与时间短有关,那么岂不是证明0.5s插入50条数据,时间不够,sqlite的性能是不错的,即使再低,也不可能低到这个程度,是不是还有其他问题??

insert错误是否与时间长短有必然联系呢?应该还有其他原因吧!

另外,对话框多于50,是因为有错误时,对话框出现,但程序不会暂停,而是接着运行,无论我是否点击ok,

那么请问是否有对话框既能提示错误,又可以中断程序执行,直到我确定对话框??

再次感谢!!
快速回复
限100 字节
 
上一个 下一个