循环执行SQL语句,居然不是很稳定,好烦啊,弄了两天了

时间:2022-04-03 19:22:53
先声明 ,以下SQL语句 完全正确,并且没有和任何全局控件进行关联,而且在单步调试执行状态时是正常的
而且ADOQuery连接数据库是正常的,给我的感觉 是太快了,就不正常,我Sleep(1000)正确率就大大提高 ,但这不合常理啊
是不是ADOQuery还有什么属性要设置呢?有哪个知道啊
//以下用到的变量都是局部定义 的,没有任何问题
for ( i = 0; i < sListBh->Count; i++)
  {
    bz = sListBh->Names[i];
    nZBH = atoi(sListBh->Values[bz].c_str());
    zbh =   ListZBBH->Values[bz];
    sql = "Insert into [工程取费] (原编号,上级编号,排序,主表,顺号,输出,项目,公式,基础,标志,专业取费) select 编号,上级编号,排序," + zbh +
          ",顺号,输出,项目,公式,基础,标志,'" + sTypeName + "'  from [;DATABASE="+DePath+"].[工程取费] where 表项=" + IntToStr(nZBH);
   aQ->ExecSQL();
}

8 个解决方案

#1


你这是什么数据库?也要考虑数据库的承受能力。

#2


ACCESS,表的数据绝对少,100多条左右

#3


如果不加延时,你说的运行不稳定是个什么状况?

#4


插入时,数据不完整,前面总是少得几条语句

我现在的操作时,插入前先删除表记录,
删除语句 delete from 表名

然后执行循环插入操作,
单步调试执行状态时是正常的 ,或ShowMessage(1);这样都正常 sleep出错率低

#5


Sleep(1000)也太夸张了吧。本地数据库吗?access 2010的数据库引擎会好一些吧。

#6


本地的数据库,Sleep 非常的夸张

#7


自定义一个休眠函数:
void __fastcall CrnSleep(UINT nDelay)
{
    DWORD dw = ::GetTickCount();

    while (::GetTickCount() - dw < nDelay)
        Application->ProcessMessages();
}

然后加到循环中:
for ( i = 0; i < sListBh->Count; i++)
{
    ...
    aQ->ExecSQL();
    CrnSleep(10);
}

看看效果。

#8


终于搞定了,只是不知是什么原因,在循环前我先删除原表记录,现在我改为先把原表的唯一条件值保存到变量里,然后直接执行循环增加,增加完记录后,再根据先前保存的唯一记录执行删除操作,测试了10几次都正常,不知什么原因了


虽然不是用ccrun哥的方法,但还是谢谢

#1


你这是什么数据库?也要考虑数据库的承受能力。

#2


ACCESS,表的数据绝对少,100多条左右

#3


如果不加延时,你说的运行不稳定是个什么状况?

#4


插入时,数据不完整,前面总是少得几条语句

我现在的操作时,插入前先删除表记录,
删除语句 delete from 表名

然后执行循环插入操作,
单步调试执行状态时是正常的 ,或ShowMessage(1);这样都正常 sleep出错率低

#5


Sleep(1000)也太夸张了吧。本地数据库吗?access 2010的数据库引擎会好一些吧。

#6


本地的数据库,Sleep 非常的夸张

#7


自定义一个休眠函数:
void __fastcall CrnSleep(UINT nDelay)
{
    DWORD dw = ::GetTickCount();

    while (::GetTickCount() - dw < nDelay)
        Application->ProcessMessages();
}

然后加到循环中:
for ( i = 0; i < sListBh->Count; i++)
{
    ...
    aQ->ExecSQL();
    CrnSleep(10);
}

看看效果。

#8


终于搞定了,只是不知是什么原因,在循环前我先删除原表记录,现在我改为先把原表的唯一条件值保存到变量里,然后直接执行循环增加,增加完记录后,再根据先前保存的唯一记录执行删除操作,测试了10几次都正常,不知什么原因了


虽然不是用ccrun哥的方法,但还是谢谢