现在一收费系统(delphi6+Sqlserver7,局域网环境) 为实现团体买单功能,加一listbox,买单时是在edit中的号回车即加入listbox,最后买单为listbox中的所有的号
买单后update收费表中的收银员,打发票。现在的问题是:打了两百张左右的单,有两张有问题,打印内容都完整(即listbox中的号都打在单上 ),但一张是前三人的收银员没update,一张是三人全都没upddate,代码如下,请高手指出问题:                     flogin.db1.StartTransaction;
                       for i:=0 to  listBox1.Items.Count-1 do
                       with q2 do
                         begin       //1
                           close;
                           sql.clear;
                           sql.Add('update w_dxsf set qrrgh=:wqrr,qrrxm=:wqrrxm, qrsj=:wqrsj where sph=:wsph and ');
                           sql.Add(' (qrrgh is null or qrrgh="") ');
                           parambyname('wqrr').AsString :=bjczygh;
                           parambyname('wqrrxm').AsString :=bjczyxm;
                           parambyname('wqrsj').AsDateTime  :=fmain.GetServerDateTime();
                           parambyname('wsph').AsString :=listbox1.Items.Strings[i];
                             prepare;
                             execsql;
                         end;  //1
                         try
                           flogin.db1.Commit ;
                           Fprintdj:=TFprintdj.Create(application);
                           Fprintdj.QRsyy.Caption:=bjczygh;
                           Fprintdj.qr1.print ;
                           listBox1.Clear ;                         except
                           flogin.db1.Rollback;
                           application.MessageBox('错误!','错误提示',mb_ok+mb_iconwarning);
                         end;
我怀疑是sqlserver本身的问题,有没有高手指点一二?

解决方案 »

  1.   

    现在问题在于 
     for i:=0 to  listBox1.Items.Count-1 do
    中的一些update语句没有实现,大家有没有见过这种问题,没有也请讨论一下
      

  2.   

    感觉sql部分没错,建议看看数据库约束关系是否有问题
      

  3.   

    单步调试可能很难发现 因为200张才张有问题特别是一张打出内容和update不一致,真的不知从何查起啊
      

  4.   

    不一致的情况发生时有没有什么特别现象?
    比方说有没有报错,或者是连续工作了很长时间,或者当时打印的是一张很长的单子?当出错后程序继续工作是否还正常?将数据库恢复到出错前的状态,再次提交相同的数据是否还出错?
    如果实在没有办法,那么在数据提交后做一次数据检查,发现不正常就报错,写错误日志
    这样可以方便检查.另外,使用的SQL的方式也有问题.
    1.由于发生变化的只是参数,所以不必每次都重新设置查询语句.
    2.prepare 和 unPrepare要配合使用,当查询语句不用之后,要使用UnPrepare释放数据库资源.
      

  5.   

    xabcxyz(gg)   感觉sql部分没错,建议看看数据库约束关系是否有问题
      我的东西根本没设置约束关系 能否给些建议。 yyfhz(火山) 
    1.由于发生变化的只是参数,所以不必每次都重新设置查询语句.
       你是说把 sql 语句写在 query中吗?
    2.prepare 和 unPrepare要配合使用,当查询语句不用之后,要使用UnPrepare释放数据库资源.
       unprepare没用过,我怎么知道update到底有没有成功,upprepare 怎么用呢?
    多谢了! 
     
      

  6.   

    yyfhz(火山) 
    数据提交后做一次数据检查,发现不正常就报错,写错误日志?
    给否给个代码参考 真的没做过,
    再次感谢
      

  7.   

    我想是不是下面这句有问题。
    for i:=0 to  listBox1.Items.Count-1 do因为我当时就遇到一个很奇怪的现象:
    我在确认按键上设了—(&S)
    结果我按键时上面这个条件完全跳过,即一个update都不执行
    但按 alt+S 就没问题。
    我最后只能怎么做啊,我把那个按键藏起来了,收费时只能按 alt+S 这个问题不知有没有合理的解释