1.用户界面中进行登录判断,输错三次禁止登录,用数据库记录ErrorTimes。
第一步:设计数据库:代码如下:
1.创建数据库:create database MyTest;
2.创建表: T_User,其中字段:ID(主键,自增,bigint), UserName(唯一约束, varchar(50) ) ,Password(varchar(50))
主键的设置SQL
insert into T_User (UserName,Password) values('张三','123');
insert into T_User (UserName,Password) values('李四','123');
select * from T_User;
添加唯一约束的代码:alter table T_User add constraint un_UserName unique(UserName);
第二步:创建一个名为LoginWindow的窗体,一个textBox-->txtName,一个password.Box--->pwdPassword,一个登录按钮-->btnLogin
第三步为登录按钮添加Click事件,代码如下:
public partial class LoginWindow : Window { public LoginWindow() { InitializeComponent(); } private void btnLogin_Click(object sender, RoutedEventArgs e) { if (txtUserName.Text.Length <= 0) { MessageBox.Show("请输入用户名!"); return; } if (pwdPassword.Password.Length <= 0) { MessageBox.Show("请输入密码!"); return; } DataTable table = SqlHelper.ExecuteDataTable("select * from T_User where UserName=@UserName", new SqlParameter("@UserName", txtUserName.Text)); if (table.Rows.Count <= 0) { MessageBox.Show("用户不存在"); return; } //防御性编程,对不可能发生的情况做处理! else if (table.Rows.Count > 1) { throw new Exception("用户名重复"); } else { DataRow row = table.Rows[0]; string dbPassword = (string)row["Password"]; long id =(long)row["ID"]; int errorTime =(int)row["ErrorTime"]; if (errorTime >= 3) { MessageBox.Show("因输入次数过多,用户已经锁定"); } if (dbPassword != pwdPassword.Password) { //把登录用户对应的ErrorTime++ SqlHelper.ExecuteNonQuery("update T_User Set ErrorTime=ErrorTime+1 where ID=@ID", new SqlParameter("@ID", id)); MessageBox.Show("密码错误"); } else { MessageBox.Show("登陆成功"); } } } }
在此时需要主要在SqlHelper中的 ExecuteNonQuery有一个含有两个参数的负载方法,代码如下:
public static void ExecuteNonQuery(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); cmd.ExecuteNonQuery(); } } }
同时也需要检查在App.config数据库连接字符串,以及SqlHelper中的连接字符串。并将App.xaml中的StartupUri="LoginWindow.xaml“
alter table T_User
add constraint un_UserName unique(UserName);
2.数据录入:从文本文件导入用户信息。易错点:Parameter的重复添加。Fill.ReaderAllLines()
拖拽一个按钮btnImport并为其添加Click事件,代码如下:
private void btnImport_Click(object sender, RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "文本文件|*.txt"; if (ofd.ShowDialog() != true) { return; } string filename=ofd.FileName; //File.ReadLines(filename);是把文件一次读取到内存string集合中 //IEnumerable<string> lines =File.ReadLines(filename,Encoding.Default); IEnumerable<string> lines = File.ReadAllLines(filename, Encoding.Default); int count = lines.Count(); foreach(string line in lines) { //把张三|18 按照|竖线分割 string[] segs = line.Split('|');//以竖线分割 string name = segs[0]; string age = segs[1]; SqlHelper.ExecuteNonQuery("insert into T_Customer(UserName,Age)values(@Name,@Age)", new SqlParameter("@Name", name), new SqlParameter("@Age", Convert.ToInt32(age))); //count++; } MessageBox.Show("成功导入" + count + "条"); }
若是将代码:IEnumerable<string> lines =File.ReadLines(filename,Encoding.Default);替换IEnumerable<string> lines =File.ReadAllLines(filename,Encoding.Default);就会出错,但是为什么会出错我不知道,还在考察!
但是可以修改如下:
private void btnImport_Click(object sender, RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "文本文件|*.txt"; if (ofd.ShowDialog() != true) { return; } string filename=ofd.FileName; //File.ReadLines(filename);是把文件一次读取到内存string集合中 IEnumerable<string> lines =File.ReadLines(filename,Encoding.Default); int count = 0; foreach(string line in lines) { //把张三|18 按照|竖线分割 string[] segs = line.Split('|');//以竖线分割 string name = segs[0]; string age = segs[1]; SqlHelper.ExecuteNonQuery("insert into T_Customer(UserName,Age)values(@Name,@Age)", new SqlParameter("@Name", name), new SqlParameter("@Age", Convert.ToInt32(age))); count++; } MessageBox.Show("成功导入" + count + "条"); }
3.数据导出:将用户信息导出到文本文件。Fill.WriteAllLine();