今天被这个函数搞晕了,按以前开发设备的经验,应该是先找到ID项,再为此ID设置CardNumber;但中控这个有点搞笑是先设置,再用SetUserInfo写入的;
经反复测试,得到的结论是SetStrCardNumber 函数只是起到给用户信息添加了个CardNumber属性并给了值(完全是个人理解)。即使设备上不存在该ID都是可以的。
实际例子如下:
procedure TfrmMain.btnRestoreClick(Sender: TObject); var i,Max,Value:integer; tmp: array[0..2047]of byte; MS: TmemoryStream; CZKEM:TCZKEM; Qry:TADOQuery; _EmpName,_PassWord,_CardNo:WideString; _EmpNo,_EmpRight:integer; _Enabled:WordBool; begin if not IsConn then begin MessageBox(self.Handle,'出错!数据库没有连接!','提示',MB_OK or MB_ICONWARNING); Exit; end; if LView1.Items.Count<1 then exit; if LView1.Selected=nil then begin MessageBox(self.Handle,'请选择一个设备!!','提示',MB_OK or MB_ICONWARNING); Exit; end; if LView1.Selected.ImageIndex=0 then begin MessageBox(self.Handle,PChar('连接设备 '+trim(LView1.Selected.Caption)+ ' 后再重试!'),'提示',MB_OK or MB_ICONWARNING); Exit; end; CZKEM:=GetCZKEM(trim(LView1.Selected.Caption),i); if CZKEM=nil then exit; MS:=TmemoryStream.Create; Qry:=TADOQuery.Create(nil); Qry.Connection:=ADOConn; try Qry.SQL.Add('select * from ZK_Userinfo order by fEmpNo'); Qry.Active:=True; if not Qry.Eof then begin ShowWinWait(Self,'正在上传用户资料,请等待.....',true); Max:=Qry.RecordCount; Value:=0; WinWaitProgressBar(Max,Value); Application.ProcessMessages; while not Qry.Eof do begin Inc(Value); WinWaitProgressBar(Max,Value); Application.ProcessMessages; //设置卡号信息 if length(Qry.fieldbyName('fCardNo').AsString)>0 then begin _CardNo:=Qry.fieldbyName('fCardNo').AsString; if CZKEM.SetStrCardNumber(_CardNo) then begin AddLogInfo('设置卡号 '+Qry.FieldbyName('fEmpNo').AsString+'-'+_CardNo+' 成功!'); end else begin AddLogInfo('设置卡号 '+Qry.FieldbyName('fEmpNo').AsString+' error!'); end; end; //--------先设置用户------------- if CZKEM.SetUserInfo(1,Qry.FieldbyName('fEmpNo').AsInteger, Qry.FieldbyName('fEmpName').AsString, Qry.FieldbyName('fPassWord').AsString, Qry.FieldbyName('fEmpRight').AsInteger, true) then begin //设置指纹信息 if not Qry.FieldByName('fTEMPLate').IsNull then begin MS.Clear;// TBlobField(Qry.FieldbyName('fTEMPLate')).SaveToStream(MS); MS.Position:=0;// ZeroMemory(@tmp[0],MS.Size); MS.ReadBuffer(tmp[0],MS.Size); if CZKEM.SetUserTmpEx(1,Qry.FieldbyName('fEmpNo').AsString ,Qry.FieldbyName('fFindID').AsInteger ,Qry.FieldbyName('fFlag').AsInteger ,pbyte(@tmp[0])^) then begin AddLogInfo('设置指纹 '+Qry.FieldbyName('fEmpNo').AsString+' 成功!'); end else begin AddLogInfo('设置指纹 '+Qry.FieldbyName('fEmpNo').AsString+' error!'); end; end; AddLogInfo('设置人员 '+Qry.FieldbyName('fEmpNo').AsString+' 成功!'); end else begin AddLogInfo('设置人员 '+Qry.FieldbyName('fEmpNo').AsString+' 失败!'); end; Qry.Next; end; end; finally Ms.Free; Qry.Free; HideWinWait; end; end;