从读卡器读取卡号后,自动向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;
"参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突."
可以保证数据类型是正确的.
代码如下:
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;
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);之内.
dm.ickxx.FieldByName('kh').AsString:=readcardno;
dm.ickxx.FieldByName('klx').AsString:='5';
dm.ickxx.FieldByName('kzt').AsString:='1';
dm.ickxx.post;//在这里加上POST试试?不过这应该不是关键的。应楼主邀请来看贴,不过看不太懂,只能凑合着说说上面这点,Sorry。
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;
线程只是得到卡号,然后提供给相应的窗体,由相应窗体负责对卡号的处理.
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的时候应该是函数认为读取正确的情况,这其中函数认为读取正确的情况下是否包含了协议中的某些错误情况
2、另外没有地方是可插入的操作,新建记录一定只能是读取卡号后,判断是否存在,不存在就插入新记录。另外在调试的情况下只是开了一个线程,而且reccount=1,都是最小的情况。
3、通过调试发现得到错误时程序至少已经执行到了insert,因此这个错误信息应该不是读卡函数造成的。
这个错误提示好象经常出现在asp中(通过google得到)。
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的时候,就是可以找到记录的时候是不会出错的,因此我可以说协议是不会出错的.
还有没有人遇见过这种情况,3天后结帖