c# mysql sdr_C#结合数据库实现验证识别ID卡内容的方法

本文所述实例为C#结合数据库,来验证所识别的ID卡内容,通过本实例代码,用户可以轻松实现对ID卡会员信息的验证。该实例代码可实现读取数据库,进而逐步实现数据库连接,数据库读取,ID卡读取,ID卡信息与数据库内容比对,最终返回结果并告之是否验证成功。

具体功能代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Data.OleDb;

using System.Runtime.InteropServices;

using System.Diagnostics;

using System.Collections;

namespace IDCard

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

public delegate int HookProc(int nCode, int wParam, IntPtr lParam);

static int hHook = 0;

public const int WH_KEYBOARD_LL = 13;

//LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。

HookProc KeyBoardHookProcedure;

[DllImport("kernel32")]

public static extern int Beep(int dwFreq, int dwDuration);//让计算机蜂鸣

string DataPath = "";//数据库路径

OleDbConnection con;//OleDbConnection对象,连接数据库

OleDbCommand cmd;//OleDbCommand对象,执行SQL语句

//键盘Hook结构函数

[StructLayout(LayoutKind.Sequential)]

public class KeyBoardHookStruct

{

public int vkCode;

public int scanCode;

public int flags;

public int time;

public int dwExtraInfo;

}

[DllImport("user32.dll")]

public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

//抽掉钩子

public static extern bool UnhookWindowsHookEx(int idHook);

[DllImport("user32.dll")]

//调用下一个钩子

public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

[DllImport("kernel32.dll")]

public static extern IntPtr GetModuleHandle(string name);

public string getNum(string code)

{

string flag = "";

switch (code)

{

case "048":

flag="0"; break;

case "049":

flag = "1"; break;

case "050":

flag = "2"; break;

case "051":

flag = "3"; break;

case "052":

flag = "4"; break;

case "053":

flag = "5"; break;

case "054":

flag = "6"; break;

case "055":

flag = "7"; break;

case "056":

flag = "8"; break;

case "057":

flag = "9"; break;

}

return flag;

}

public void Hook_Start()

{

// 安装键盘钩子

if (hHook == 0)

{

KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);

hHook = SetWindowsHookEx(WH_KEYBOARD_LL,

KeyBoardHookProcedure,

GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);

//如果设置钩子失败.

if (hHook == 0)

{

Hook_Clear();

}

}

}

//取消钩子事件

public void Hook_Clear()

{

bool retKeyboard = true;

if (hHook != 0)

{

retKeyboard = UnhookWindowsHookEx(hHook);

hHook = 0;

}

//如果去掉钩子失败.

if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");

}

//这里可以添加自己想要的信息处理

string NumCode="";

public int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)

{

if (nCode >= 0)

{

if (wParam == 0x0104 || wParam == 0x0100)

{

KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));

int flag = kbh.vkCode;

switch (flag)

{

case 96:

NumCode += "0"; break;

case 97:

NumCode += "1"; break;

case 98:

NumCode += "2"; break;

case 99:

NumCode += "3"; break;

case 100:

NumCode += "4"; break;

case 101:

NumCode += "5"; break;

case 102:

NumCode += "6"; break;

case 103:

NumCode += "7"; break;

case 104:

NumCode += "8"; break;

case 105:

NumCode += "9"; break;

}

if (flag == 13)

{

if (NumCode.Length != 0)

{

string c = "";

string id = "";

for (int i = 0; i <= NumCode.Length - 3; i += 3)

{

string b = NumCode.Substring(i, 3);

c += getNum(b);

}

id = c;

if (id.Length == 8)//如果卡号为8位

{

//实例化OleDbConnection对象

con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + DataPath);

con.Open();//打开数据库连接

//实例化OleDbCommand对象,根据ID卡号检索数据表

cmd = new OleDbCommand("select * from tb_UserInfo where CardID='" + id + "'", con);

OleDbDataReader sdr = cmd.ExecuteReader();//实例化OleDbDataReader对象

sdr.Read();//读取记录

txtShowCardID.Text = id;//获取ID卡号

txtShowName.Text = sdr["UName"].ToString();//获取员工姓名

cbbShowSex.Text = sdr["USex"].ToString();//获取员工性别

cbbShowDep.Text = sdr["UDep"].ToString();//获取员工部门

con.Close();//关闭数据库连接

Beep(3000, 100);//计算机蜂鸣

}

NumCode = "";

}

}

}

}

return CallNextHookEx(hHook, nCode, wParam, lParam);

}

private void Form1_Load(object sender, EventArgs e)

{

cbbdep.SelectedIndex = 0;//设置部门下拉框的第一项被选中

cbbsex.SelectedIndex = 0;//设置性别下拉框的第一项被选中

//获取数据库路径

DataPath = Application.StartupPath.ToString();

DataPath = DataPath.Substring(0, DataPath.LastIndexOf("\\"));

DataPath = DataPath.Substring(0, DataPath.LastIndexOf("\\"));

DataPath += @"\db.mdb";

}

private void radioButton1_CheckedChanged(object sender, EventArgs e)

{

if (radioButton1.Checked)

{

groupBox1.Enabled = true;

Hook_Clear();

}

}

private void radioButton2_CheckedChanged(object sender, EventArgs e)

{

if (radioButton2.Checked)

{

groupBox1.Enabled = false;

Hook_Start();

}

}

private void button2_Click(object sender, EventArgs e)

{

txtIdcard.Text = "";

txtName.Text = "";

}

private void button1_Click(object sender, EventArgs e)

{

if (txtIdcard.Text == "" || txtName.Text == "")//如果没有输入ID卡号和员工姓名

{

//弹出警告信息

if (MessageBox.Show("请将数据填写完整!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK)

{

if (txtIdcard.Text == "")//如果没有输入ID卡号

txtIdcard.Focus();//则光标处在输入ID卡号的文本框

if (txtName.Text == "")//如果没有输入员工姓名

txtName.Focus();//则光标处在输入员工姓名的文本框

if (txtIdcard.Text == "" && txtName.Text == "")//如果都没输入数据

txtIdcard.Focus();//则光标处在输入ID卡号的文本框

}

}

else//如果输入了数据

{

if (txtIdcard.Text.Trim().Length != 8)//如果输入的ID卡号不是8位

{

//弹出警告信息

if (MessageBox.Show("ID卡号必须为8位!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK)

{

txtIdcard.Text = "";//清空输入ID卡号的文本框

txtIdcard.Focus();//让光标处在输入ID卡号的文本框上

}

}

else//如果输入的ID卡号为8位

{

//实例化OleDbConnection对象

con=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + DataPath);

con.Open();//打开连接

//实例化OleDbCommand对象

cmd = new OleDbCommand("select count(*) from tb_UserInfo where CardID='"+txtIdcard.Text.Trim()+"'", con);

int flag =Convert.ToInt32(cmd.ExecuteScalar());//判断是否已经添加过此ID卡号

if (flag > 0)//如果大于0则说明已经添加过

{

//弹出警告信息

if (MessageBox.Show("ID卡号已经添加过了!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK)

{

button2_Click(sender, e);//清空输入ID卡号和员工姓名的文本框

}

}

else//如果小于0说明没有添加过

{

//实例化OleDbCommand对象

cmd = new OleDbCommand("insert into tb_UserInfo(CardID,UName,USex,UDep) values ('" + txtIdcard.Text.Trim() + "','" + txtName.Text.Trim() + "','" + cbbsex.Text.Trim() + "','" + cbbdep.Text.Trim() + "')", con);

int k = cmd.ExecuteNonQuery();//执行insert语句,将输入的信息添加到数据库中

if (k > 0)//如果大于0则操作成功

{

//弹出提示信息

if (MessageBox.Show("添加成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)

{

button2_Click(sender, e);//清空输入ID卡号和员工姓名的文本框

}

}

}

con.Close();//关闭数据库连接

}

}

}

private void txtIdcard_KeyPress(object sender, KeyPressEventArgs e)

{

if (!(e.KeyChar <= '9' && e.KeyChar >= '0') && e.KeyChar != '\r' && e.KeyChar != '\b')

{

e.Handled = true;

}

}

}

}

该实例注释完善,便于阅读,读者还可以根据自身需求改善代码,或者添加新的功能以满足自身应用的个性化需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

递归算法 流程图_什么是算法?如何学习算法?算法入门的学习路径

什么是算法&#xff1f;有一个很著名的公式 “程序数据结构算法”。曾经跟朋友吃饭的时候我问他什么是算法&#xff0c;他说算法嘛&#xff0c;就是一套方法&#xff0c;需要的时候拿过来&#xff0c;套用就可以&#xff0c;我吐槽他&#xff0c;他说的是小学数学题的算法&…

java webmethod 参数_java详解Spring接收web请求参数的方式

本篇文章给大家带来的内容是java详解Spring接收web请求参数的方式 。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。1 查询参数请求格式&#xff1a;url?参数1值1&参数2值2...同时适用于GET和POST方式spring处理查询参数的方法又…

envoy重试_具有Envoy代理的微服务模式,第二部分:超时和重试

envoy重试该博客是系列文章的一部分&#xff0c;该系列文章更深入地介绍了Envoy Proxy和Istio.io &#xff0c;以及它如何实现一种更优雅的连接和管理微服务的方式。 跟随我christianposta &#xff0c;紧跟这些博客文章的发布。 什么是Envoy代理 &#xff0c;它如何工作&…

python中字符串格式化的形式_Python中format函数字符串格式化入门

格式化在程序开发中非常常见&#xff0c;大家肯定不陌生&#xff0c;Python中也存在多重格式化方式&#xff0c;format函数就是其中一种。函数原型format(value[, format_spec])参数意义value&#xff1a; 需要被格式化的字符串format_spec&#xff1a; 格式化的格式函数定义与…

Java的超类/基类Object

文章目录简介主要方法equals简介 所有的类都继承了 Object&#xff0c;即 Object 是所有类的父类&#xff0c;所以所有的 Java 类都继承了 Object 的所有方法。 比如你写一个类如下&#xff1a; public class Question { ... }实际上这个类是继承自 Object 的&#xff0c;默…

网络研讨室_即将举行的网络研讨会:调试生产中Java的5种最佳实践

网络研讨室您的团队是否花费超过10&#xff05;的时间在生产中调试Java&#xff1f; 将新代码部署到生产中是一项艰巨的任务。 在您的本地环境中起作用的东西在生产中的作用并不相同&#xff0c;您可以通过用户来了解。 不理想吧&#xff1f; 生产中的调试是一个关键要素&…

window部署python项目_Django在Window下的部署

转载 : codingsoho.com前言本文主要介绍利用apache去部署Django项目&#xff0c;所有步骤均在本机Window7和阿里云验证通过。配置本例的基本配置如下&#xff1a;工作目录&#xff1a; C:/virtualenv/zakkabag项目名称&#xff1a; zakkabag最终的安装版本如下&#xff0c;后面…

chrome gwt1.7_快速提示:使用Chrome开发工具调试GWT应用程序

chrome gwt1.7调试是软件开发的重要方面。 拥有正确的工具可以节省大量时间和头痛。 在GWT Super Dev模式之前&#xff0c;经典的Dev模式允许使用JVM调试。 开发人员可以在其IDE中设置断点&#xff0c;并使用调试模式来跟踪错误和错误。 现在&#xff0c;在超级开发模式下&…

java事件编程_java基础 ---Swing事件编程

java基础 ---Swing事件编程GUI的设计就剩个菜单组建&#xff0c;这个组件也是想当于容器套容器&#xff0c;在设计方面没有什么难度&#xff0c;主要是一些事件的响应。还有另一种事件的监听方式&#xff0c;也就是适配器监听方法。1、菜单要设计一个菜单那么有三大组件是不可或…

python3鄙视python2_Python3 正在毁灭 Python的原因分析

Python 3毫不费力地成为发生在Python社区里最糟糕的事。我还记得第一次使用Python的时候&#xff0c;我还在花大量时间在C这块上&#xff0c;而Python就像是我的一次开光。我可以打开文本编辑器用几秒钟或者几分钟写出一个可以工作的程序&#xff0c;而不是用几小时或几天。我记…

Java如何加载类的呢?

JVM加载类 首先查看内存中是否存在该类&#xff08;内存中所有类都是以Class的实例对象存在&#xff09;&#xff0c;若不存在则会通过环境变量中的路径值在电脑或者其它设备的硬盘中找到该类&#xff08;即.class文件&#xff09;&#xff0c;然后JVM会将其读取到内存中&…

brew卸载jenv_使用brew,cask和jenv在MacOSX上设置多个Java JRE / JDK

brew卸载jenv昨天在Java9的Jigsaw HackTheTower事件中&#xff0c;我意识到我需要加强我的游戏并改善我现有的机制&#xff0c;以在我的机器上维护几个不同的JDK。 我曾经手动下载jdk&#xff0c;或使用brew cask来安装它们&#xff0c;我会在我的〜/ bash_profile中设置bash …

java过滤器api_springboot集成过滤器

封装自定义接口filter包含两个方法,第一个过滤的路径数组,第二个为过滤器执行的顺序.spring boot 会按照order值的大小&#xff0c;从小到大的顺序来依次过滤。package com.theeternity.common.baseFilter;import javax.servlet.Filter;/*** program: ApiBoot* description: 封…

Servlet 运行原理

文章目录Servlet 如何运行演示 Servlet 运行原理Servlet 如何运行 用户向浏览器地址栏输入&#xff1a;http://ip:port/helloweb/sayHello?namezs 浏览器使用 ip:port(端口号)连接服务器 浏览器将请求数据按照 http 协议打成一个数据包(请求数据包)发送给服务器 请求数据包…

python dicom 器官分割_python+opencv阈值分割

37 #获取像素点的最大值和最小值38 arr_temp np.reshape(img_arr,(lens,))39 max_val max(arr_temp)40 min_val min(arr_temp)41 #图像归一化42 img_arr (img_arr-min_val)/(max_val-min_val)43 #绘制图像并保存44 #保存图片时去掉周围白边45 plt.axis(off)46 fig plt.gcf()47…

解析浏览器访问服务器 Servlet 应用程序的交互过程(Servlet 容器如何处理请求资源路径)

案例 1&#xff1a; 请求资源路径&#xff1a;http://localhost:8080/web01/greeting?namezs 浏览器通过 localhost:8080 连接服务器&#xff1b;服务器在 webapps 目录下寻找 web01 目录&#xff0c;找到后进入web01 目录内寻找 WEB-INF 目录&#xff0c;在进入 WEB-INF 目…

java github_GitHub Research:超过50%的Java记录语句写错了

java github为什么生产日志无法帮助您找到错误的真正根本原因&#xff1f; 询问您是否使用日志文件监视您的应用程序几乎就像询问…您是否喝水。 我们都使用日志&#xff0c;但是我们如何使用它们则是一个完全不同的问题。 在下面的文章中&#xff0c;我们将对日志进行更深入…

yolov5论文_YOLOv5的妙用:学习手语,帮助听力障碍群体

编辑&#xff1a;魔王、杜伟计算机视觉可以学习美式手语&#xff0c;进而帮助听力障碍群体吗&#xff1f;数据科学家 David Lee 用一个项目给出了答案。如果听不到了&#xff0c;你会怎么办&#xff1f;如果只能用手语交流呢&#xff1f;当对方无法理解你时&#xff0c;即使像订…

python制作系统程序与html交互_python+html语音人物交互_flask后台与前端(html)交互的两种方法...

基于python flask框架搭建webflask后台与前端(html)交互的两种方法&#xff1a;方法1 使用flask-wtf 提供的表单用常见的登录为例&#xff1a;// An highlighted blockfrom flask_wtf import Formclass LoginForm(Form): # 登录表单ROLE SelectField(角色, choices[(s, 管理员…

Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解)

Student s new Student(); s.play(); Student s2 new Student();以上代码的执行流程如下&#xff1a; JVM 作为操作系统的一个迚程在系统中执行&#xff0c;那么系统会为 JVM 分配一块内存空间&#xff0c;这块内存空 间被 JVM 分为 3 大块(栈区、堆区、方法区) 一般而言&a…