【ADO.NET】2、各种版本的 简单登录验证

一、简单登录验证(防SQL注入)

GetString(序号) 返回某一列的值(当用户不记得列名序号时,可使用GetOrdinal()获取到序号)
GetInt32(序号) 针对的是 int 字段,返回int字段的值
GetOrdinal("列名") 根据列名得到序号

复制代码
Console.WriteLine("请输入用户名:");
string Uname=Console.ReadLine();

Console.WriteLine("请输入密码:");
string Pwd=Console.ReadLine();

using (SqlConnection conn = new SqlConnection("Data Source=.;database=mytest;uid=sa;pwd=gao;"))
{
  conn.Open();
  using (SqlCommand cmd = conn.CreateCommand())
  {
    //User为关键字,用[]解决,表名T_开头,字段F开头
    cmd.CommandText = "select * from mydo where username='" + Uname + "'";
    using (SqlDataReader dr = cmd.ExecuteReader())
    {
      if (dr.Read())
      {
        //防止SQL注入,GetString(序号)返回某一列的值,GetOrdinal()根据列名得到序号
        string dbpasswd = dr.GetString(dr.GetOrdinal("passwd"));
        if (Pwd == dbpasswd) //判断用户输入的与数据库查询到的是否一致
        {
          Console.WriteLine("登录成功!");
        }
        else
        {
           Console.WriteLine("密码错误!");
        }
      }
      else
      {
        Console.WriteLine("用户名错误!");
      }
    }
  }
}
复制代码

 

二、简单登录验证 (通过参数赋值)(防SQL注入)
复制代码
Console.WriteLine("请输入用户名:");
string username=Console.ReadLine();

Console.WriteLine("请输入密码:");
string passwd=Console.ReadLine();

using (SqlConnection conn = new SqlConnection("Data Source=.;database=mytest;uid=sa;pwd=gao;"))
{
  conn.Open();
  using (SqlCommand cmd = conn.CreateCommand())
  {
    cmd.CommandText = "select * from mydo where username=@Uname and passwd=@Pwd";     cmd.Parmeters.Add(new SqlParmeter("Uname",username));     cmd.Parmeters.Add(new SqlParmeter("Pwd",passwd));     using (SqlDataReader dr = cmd.ExecuteReader())     {       if (dr.Read())       {         Console.WriteLine("登陆成功!");       }       else       {         Console.WriteLine("登陆失败!");       }     }   } }
复制代码

 

三、简单登录验证(含有错误次数的判断)


首先在数据库中加入 error 字段,类型为 int 默认值为 0
注意:在同一个连接中,如果SqlDataReader没有关闭,那么是不能执行Update之类的语句的
所以下面对于 error 次数的修改,都是通过 函数 的方式来实现

复制代码
private void IncErrorTimes()        //用于为error字段自增值的 函数(方法)
{ using (SqlConnection conn = new SqlConnection("server=.;database=mytest;uid=sa;pwd=gao;")) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "update mydo set error=error+1 where username=@U"; cmd.Parameters.Add(new SqlParameter("@U", txtLogin.Text.Trim())); cmd.ExecuteNonQuery(); } } } private void ResetErrorTimes() //用于为error字段复位(设置为0)的 函数
{ using (SqlConnection conn = new SqlConnection("server=.;database=mytest;uid=sa;pwd=gao;")) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "update mydo set error=0 where username=@U"; cmd.Parameters.Add(new SqlParameter("@U", txtLogin.Text.Trim())); cmd.ExecuteNonQuery(); } } } private void button1_Click(object sender, EventArgs e) //主程序 { using (SqlConnection conn = new SqlConnection("server=.;database=mytest;uid=sa;pwd=gao;")) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "select * from mydo where username=@U"; cmd.Parameters.Add(new SqlParameter("U", txtLogin.Text.Trim())); using (SqlDataReader dr = cmd.ExecuteReader()) { if (dr.Read()) { int errorTimes = dr.GetInt32(dr.GetOrdinal("error")); if (errorTimes >= 3) { MessageBox.Show("错误次数过多,禁止登陆!"); return; } string dbname = dr.GetString(dr.GetOrdinal("username")); if (dbname == txtLogin.Text.Trim()) { string dbpasswd = dr.GetString(dr.GetOrdinal("passwd")); if (dbpasswd == txtPasswd.Text.Trim()) { ResetErrorTimes(); MessageBox.Show("登陆成功!"); picBox1.Visible = true; } else { IncErrorTimes(); MessageBox.Show("登陆失败!"); return; } } } else { MessageBox.Show("用户名错误!"); } } } }
复制代码

 

posted on 2017-05-11 21:09 叶祖辉 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/yezuhui/p/6842799.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ADO组件的使用需要利用支持COM的高级语言,例如ASP中的VBScript或者Visual Basic,甚至Delphi,微软的竞争对手Borland的一个产品,现在也支持使用ADO来访问数据库。   在新的编程框架.NET Framework中, 微软也提供了一个面向Internet的版本的ADO,称为ADO.NET。其对象模型和传统ADO差别很大。 ADO是一种面向对象的编程接口,微软介绍说,与其同IBM和Oracle提倡的那样,创建一个统一数据库,不如提供一个能够访问不同数据库的统一接口,这样会更加实用一些。为实现这一目标,微软在数据库和微软的OLE DB中提供了一种“桥”程序,这种程序能够提供对数据库的连接。 开发人员在使用ADO时,其实就是在使用OLE DB,不过OLE DB更加接近底层。ADO的一项属性远程数据服务,支持“数据仓库”ActiveX 组件以及高效的客户端缓存。作为ActiveX的一部分,ADO也是COM组件的一部分。ADO是由早期的微软数据接口??远程数据对象RDO演化而来的。RDO同微软的ODBC一同连接关系数据库,不过不能连接非关系数据库。   ADO向我们提供了一个熟悉的,高层的对OLE DB的Automation封装接口。对那些熟悉RDO的程序员来说,你可以把OLE DB比作是ODBC驱动程序。如同RDO对象是ODBC驱动程序接口一样,ADO对象是OLE DB的接口;如同不同的数据库系统需要它们自己的ODBC驱动程序一样,不同的数据源要求它们自己的OLE DB提供者(OLE DB provider)。目前,虽然OLE DB提供者比较少,但微软正积极推广该技术,并打算用OLE DB取代ODBC。   ADO向VB程序员提供了很多好处。包括易于使用,熟悉的界面,高速度以及较低的内存占用(已实现ADO2.0的Msado15.dll需要占用342K内存,比RDO的Msrdo20.dll的368K略小,大约是DAO3.5的Dao350.dll所占内存的60%)。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立创建。因此你可以只创建一个"Connection"对象,但是可以有多个,独立的"Recordset"对象来使用它。ADO针对客户/服务器以及WEB应用程序作了优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值