案例(一)(12)

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();

 

posted @ 2013-05-29 23:11  秋水惜朝  阅读(183)  评论(0编辑  收藏  举报