从读卡器读取卡号后,自动向adoquery添加记录,结果偶尔正常,偶尔提示
"参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突."
可以保证数据类型是正确的.
代码如下:
procedure TMyTread.Execute;
var
readcardno:string;
i:integer;
begin
SetLength(ReadCardNo,10);
while true do
begin
for i:=0 to reccount-1 do
 if ParkReadCardSn(dz[i],pchar(readcardno))=0 then
  begin
    mainform.sbar.Panels[11].Text:=readcardno;
    if (Screen.ActiveForm is Tcx_tcjl) then (Screen.ActiveForm as Tcx_tcjl).ComboEdit1.Text:=readcardno;
    if (Screen.ActiveForm is Tlskgl) then
      if not dm.ickxx.Locate('kh',readcardno,[]) then
       begin
        dm.ickxx.Insert;
        dm.ickxx.FieldByName('kh').AsString:=readcardno;
        dm.ickxx.FieldByName('klx').AsString:='5';
        dm.ickxx.FieldByName('kzt').AsString:='1';
        end;
   end;
sleep(1000);
end;
if terminated then  exit;
end;

解决方案 »

  1.   

    出错范围是在
        if (Screen.ActiveForm is Tlskgl) then
          if not dm.ickxx.Locate('kh',readcardno,[]) then
           begin
            dm.ickxx.Insert;
            dm.ickxx.FieldByName('kh').AsString:=readcardno;
            dm.ickxx.FieldByName('klx').AsString:='5';
            dm.ickxx.FieldByName('kzt').AsString:='1';
            end;
       end;
    sleep(1000);之内.
      

  2.   

    虽然不影响操作,但是有提示总归不好,有什么办法屏蔽掉错误信息,try检测不到错误,郁闷!!
      

  3.   

    dm.ickxx.Insert;
            dm.ickxx.FieldByName('kh').AsString:=readcardno;
            dm.ickxx.FieldByName('klx').AsString:='5';
            dm.ickxx.FieldByName('kzt').AsString:='1';
            dm.ickxx.post;//在这里加上POST试试?不过这应该不是关键的。应楼主邀请来看贴,不过看不太懂,只能凑合着说说上面这点,Sorry。
      

  4.   

    另外,可不可以把for i:=0 to reccount-1 do 改为for i:=reccount-1 downto 0 do ?在看不懂的前提下,我胡乱答的,答错了别见怪
      

  5.   

    procedure TMyTread.Execute;  //线程
    var
    readcardno:string;
    i:integer;
    begin
    SetLength(ReadCardNo,10);
    while true do              //监听串口
    begin
    for i:=0 to reccount-1 do   //reccount是设备地址的数量,线程成员
     if ParkReadCardSn(dz[i],pchar(readcardno))=0 then    //ParkReadCardSn主动方式读卡号,缓冲区有数据侧返回卡号信息,readcardno是卡号,dz[]存储地址值
      begin
        mainform.sbar.Panels[11].Text:=readcardno;
        if (Screen.ActiveForm is Tcx_tcjl) then (Screen.ActiveForm as Tcx_tcjl).ComboEdit1.Text:=readcardno;//得到当前活动窗体,根据当前窗体的选择相应的操作
        if (Screen.ActiveForm is Tlskgl) then
          if not dm.ickxx.Locate('kh',readcardno,[]) then  //如果卡号已经登记则定位记录
           begin
            dm.ickxx.Insert;                               //如果没有登记则添加记录
            dm.ickxx.FieldByName('kh').AsString:=readcardno;     //记录卡号
            dm.ickxx.FieldByName('klx').AsString:='5';           //输入类型1个字符
            dm.ickxx.FieldByName('kzt').AsString:='1';          //输入状态1个字符
            end;
       end;
    sleep(1000);                                                //延时1秒钟
    end;
    if terminated then  exit;                                   //结束线程
    end;
      

  6.   

    另外post不能是在线程中完成的,因为还有其他数据要登记.
    线程只是得到卡号,然后提供给相应的窗体,由相应窗体负责对卡号的处理.
      

  7.   

    没有看见全部代码也只能猜一下可能的情况:
    1、本代码中所用到的表的主键应该‘kh’,同时ParkReadCardSn主动方式读卡号,这个函数读完以后没有马上清空一下缓冲区,导致别的线程或者别的什么地方在还可以读到同样的卡号
    2、if (Screen.ActiveForm is Tlskgl) then
          if not dm.ickxx.Locate('kh',readcardno,[]) then
           begin
            dm.ickxx.Insert;
            dm.ickxx.FieldByName('kh').AsString:=readcardno;
            dm.ickxx.FieldByName('klx').AsString:='5';
            dm.ickxx.FieldByName('kzt').AsString:='1';
            end;
       end;
       这段代码没有互斥,可能会出现另外有地方也插入该表数据的情况,既然这个表相关的插入操作出现在多线程里面,那么与该表相关的插入或者修改操作就应该写成通用的函数,以便在函数中做适当的互斥处理
    3、主动读取的时候返回是0的时候应该是函数认为读取正确的情况,这其中函数认为读取正确的情况下是否包含了协议中的某些错误情况
      

  8.   

    1、ParkreadcardSn读取卡号后自动清空缓冲区。
    2、另外没有地方是可插入的操作,新建记录一定只能是读取卡号后,判断是否存在,不存在就插入新记录。另外在调试的情况下只是开了一个线程,而且reccount=1,都是最小的情况。
    3、通过调试发现得到错误时程序至少已经执行到了insert,因此这个错误信息应该不是读卡函数造成的。
    这个错误提示好象经常出现在asp中(通过google得到)。
      

  9.   

    如果单独读取卡号后给一个控件,不做数据库处理是一点没有问题的,如:if ParkReadCardSn(dz[i],pchar(readcardno))=0 then    //ParkReadCardSn主动方式读卡号,缓冲区有数据侧返回卡号信息,readcardno是卡号,dz[]存储地址值
      begin
        mainform.sbar.Panels[11].Text:=readcardno;
        if (Screen.ActiveForm is Tcx_tcjl) then (Screen.ActiveForm as Tcx_tcjl).ComboEdit1.Text:=readcardno;//得到当前活动窗体,根据当前窗体的选择相应的操作无论怎么读都不出错包括
    if (Screen.ActiveForm is Tlskgl) then          
          if not dm.ickxx.Locate('kh',readcardno,[]) then   //这里为true的时候,就是可以找到记录的时候是不会出错的,因此我可以说协议是不会出错的.
      

  10.   

    可能是线程中死循环操作数据库,或者真的是封装的协议本身有问题,现在我这段程序放在spcomm中一点没有问题.
    还有没有人遇见过这种情况,3天后结帖