VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > c#编程 >
  • C#教程之C#结合数据库实现验证识别ID卡内容的方

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

具体功能代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
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;
      }
    }
  }
}

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


相关教程