using Check.DataOperate; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace UAS_CheckWork { public partial class Form2 : Form { public Form2() { InitializeComponent(); } DataHelper dh = new DataHelper(); //Create Standalone SDK class dynamicly. public zkemkeeper.CZKEMClass axCZKEM1 = new zkemkeeper.CZKEMClass(); private bool bIsConnected = false;//the boolean value identifies whether the device is connected private int iMachineNumber = 1;//the serial number of the device.After connecting the device ,this value will be changed. private void Form2_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add("UserID"); dt.Columns.Add("AttState"); dt.Columns.Add("VerifyMethod"); dt.Columns.Add("Time"); dt.Columns.Add("WorkCode"); logInfo.DataSource = dt; } private void btnConnect_Click(object sender, EventArgs e) { if (txtIP.Text.Trim() == "" || txtPort.Text.Trim() == "") { MessageBox.Show("请先输入IP和端口", "Error"); return; } int idwErrorCode = 0; Cursor = Cursors.WaitCursor; if (btnConnect.Text == "断开连接") { axCZKEM1.Disconnect(); bIsConnected = false; btnConnect.Text = "连接"; lblState.Text = "状态:未连接"; startListening.Text = "开始实时事件"; Cursor = Cursors.Default; return; } bIsConnected = axCZKEM1.Connect_Net(txtIP.Text, Convert.ToInt32(txtPort.Text)); if (bIsConnected) { btnConnect.Text = "断开连接"; btnConnect.Refresh(); lblState.Text = "状态:已连接"; iMachineNumber = 1;//In fact,when you are using the tcp/ip communication,this parameter will be ignored,that is any integer will all right.Here we use 1. axCZKEM1.RegEvent(iMachineNumber, 65535);//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all) } else { axCZKEM1.GetLastError(ref idwErrorCode); MessageBox.Show("无法连接设备,ErrorCode=" + idwErrorCode.ToString(), "Error"); } Cursor = Cursors.Default; } private void startListening_Click(object sender, EventArgs e) { if (!bIsConnected) { MessageBox.Show("请先连接设备", "Error"); return; } if (startListening.Text == "正在实时监听") { MessageBox.Show("已启动监听", "Error"); return; } int idwErrorCode = 0; //开始注册考勤机的监听事件 if (axCZKEM1.RegEvent(iMachineNumber, 1))//65535表示注册所有的事件 { //注册事件 this.axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx); //注册成功提示用户 startListening.Text = "正在实时监听"; } else { axCZKEM1.GetLastError(ref idwErrorCode); MessageBox.Show("注册监听事件失败,ErrorCode=" + idwErrorCode.ToString(), "Error"); } } /// /// 考勤机验证通过 /// /// UserID /// 1 为无效记录,0 为有效记录 /// 0—Check-In 1—Check-Out 2—Break-Out 3—Break-In 4—OT-In 5—OT-Out /// :0 为密码验证,1 为指纹验证,2 为卡验证 /// /// /// /// /// /// /// WorkCode 返回验证时 WorkCode 值,当机器无 Workcode 功能时,该值返回 0 private void axCZKEM1_OnAttTransactionEx(string sEnrollNumber, int iIsInValid, int iAttState, int iVerifyMethod, int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int iWorkCode) { //实现实时获取考勤,取有效记录 if (iIsInValid == 0) { //显示 DataTable dt = (DataTable)logInfo.DataSource; DataRow dr = dt.NewRow();//新建行 dr["UserID"] = sEnrollNumber; switch (iVerifyMethod) { case 0: dr["VerifyMethod"] = "密码"; break; case 1: dr["VerifyMethod"] = "指纹"; break; case 2: dr["VerifyMethod"] = "卡"; break; default: break; } string Time = iYear + "-" + iMonth + "-" + iDay + " " + iHour + ":" + iMinute + ":" + iSecond; dr["Time"] = Time; dr["WorkCode"] = iWorkCode; dt.Rows.Add(dr); logInfo.DataSource = dt; //更新数据库 dh.ExecuteSql("insert into cardlog (cl_id,cl_cardcode,cl_time,cl_address) values (cardlog_seq.nextval,'" + sEnrollNumber + "',TO_DATE('" + Time + "','yyyy-MM-dd hh24:mi:ss'),'考勤机数据导入')", "insert"); } else { //记录验证无效 } } } }