ado.net学习笔记入门


1.ado.net

     程序要和数据库交互要通过ado.net进行,通过ado.net就能在程序中执行SQL了.ado.net
     在拷贝数据库的时候要注意,要先关闭连接
    
     神奇的代码
        string   dataDir =   AppDomain .CurrentDomain.BaseDirectory;
              if   (dataDir.EndsWith( @"\bin\Debug\"   )
                  || dataDir.EndsWith(   @"\bin\Release\" ))
            {
                dataDir = System.IO.   Directory .GetParent(dataDir).Parent.Parent.FullName;
                  AppDomain .CurrentDomain.SetData( "DataDirectory"   , dataDir);
            }
              //以上是必写代码,具体参考http://www.rupeng.com/forum/thread-11988-1-1.html
          //防止数据库源文件选择出错

2.连接SQLServer
     连接字符串,程序通过连接字符串指定要连哪个势力的哪个数据库,用什么用户名密码.
     项目内嵌mdf文件形式的连接字符串
      using ( SqlConnection   conn =   new   SqlConnection ( @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True;" ))
            {
                conn.Open();
            }
              Console .WriteLine( "打开数据库成功"   );
              Console .ReadKey();
     ado.net中通过sqlconnection类创建到SQLServer的连接,SqlConnection代表数据库连接,ado.net中的连接等资源都实现IDisposable接口,可以使用using进行管理,using资源释放
     别忘了using System.Data.Sqlclint
        


3.cmd     
      cmd.CommandText =   "INSERT INTO MyTable1(Name)VALUES('zjh')"   ;
        cmd.ExecuteNonQuery();
          Console .WriteLine( "插入成功"   );

4.简单的用户输入用户名,密码,再插入到数据库中
      //用户写入用户名,密码,插入数据
              Console .Write( "请输入用户名:"   );
              string   UserName =   Console   .ReadLine();
              Console .Write( "请输入密码:"   );
              string   Password =   Console   .ReadLine();
              //读取数据完毕,下面链接数据库,插入数据
              using   ( SqlConnection   conn =   new   SqlConnection ( @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True;" ))
            {
                conn.Open();
                  using   ( SqlCommand   cmd = conn.CreateCommand())
                {
                    cmd.CommandText =   "INSERT INTO T_User(UserName,Password)VALUES('"   + UserName +   "','"   + Password +   "')"   ;
                    cmd.ExecuteNonQuery();
                      Console .WriteLine( "插入成功"   );
                }
            }

5.取表的第一行第一列
      using   ( SqlConnection   conn =   new   SqlConnection ( @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True;" ))
            {
                conn.Open();
                  using   ( SqlCommand   cmd = conn.CreateCommand())
                {
                    cmd.CommandText =   "select count(*) from T_User"   ;
                      int   i =   Convert   .ToInt32(cmd.ExecuteScalar());   //返回表的行数,取结果的第一行的第一列
                      Console .WriteLine(i);
                }
            }

6.得到自增字段的值   OUTPUT  inserted.Id
      //用户写入用户名,密码,插入数据
              Console .Write( "请输入用户名:"   );
              string   UserName =   Console   .ReadLine();
              Console .Write( "请输入密码:"   );
              string   Password =   Console   .ReadLine();
              //读取数据完毕,下面链接数据库,插入数据并且返回自增字段的值
              using   ( SqlConnection   conn =   new   SqlConnection ( @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True;" ))
            {
                conn.Open();
                  using   ( SqlCommand   cmd = conn.CreateCommand())
                {
                    cmd.CommandText =   "insert into T_User(UserName,Password) output inserted.id values('"   + UserName +   "','"   + Password +   "')" ;
                      //得到自增字段的值
                      int   id =   Convert   .ToInt32(cmd.ExecuteScalar());
                      Console .WriteLine( "插入成功\n新插入的主键为:{0}"   , id);
                }
            }

7.ExecuteReader
执行多行结果集的用ExecuteReader
      using  ( SqlCommand  cmd = conn.CreateCommand())
                {
                    cmd.CommandText =  "SELECT * FROM MyTable1"  ;
                     using  ( SqlDataReader  dr = cmd.ExecuteReader()) //只能逐行向前,无法回头,轻量级
                    {
                         while  (dr.Read())
                        {
                             //Console.WriteLine(dr.GetString(0));
                             string  userName = dr.GetString(dr.GetOrdinal( "Name" ));
                             int  Id = dr.GetInt32(dr.GetOrdinal( "Id"  ));
                             string  password = dr.GetString(dr.GetOrdinal( "Password" ));
                             Console .WriteLine( "Id={0},UserName={1},Password={2}"  , Id, userName, password);
                             //Console.WriteLine(dr.GetString(dr.GetOrdinal("Password")));
                        }
                    }   
                }

reader的GetString,GetInt32,等方法只接受整数参数,也就是序列号,用GetOrdinal方法根据列名动态得到序列号

8.登录练习
      //用户写入用户名,密码,插入数据
              Console .Write( "请输入用户名:"   );
              string   UserName =   Console   .ReadLine();
              Console .Write( "请输入密码:"   );
              string   Password =   Console   .ReadLine();

              using   ( SqlConnection   conn =   new   SqlConnection ( @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True;" ))
            {
                conn.Open();
                  using   ( SqlCommand   cmd = conn.CreateCommand())
                {
                    cmd.CommandText =   "select * from T_User where UserName='"   + UserName +   "'" ;
                      //先到表中查询用户输入的用户名对应的信息
                      using   ( SqlDataReader   reader = cmd.ExecuteReader())
                    {
                          if   (reader.Read())   //个人感觉用reader.HasRows()比较好
                        {
                              //用户存在
                              string   dbpassword = reader.GetString(reader.GetOrdinal( "Password" ));
                              if   (Password == dbpassword)
                            {
                                  Console .WriteLine( "密码正确,登录成功"   );
                            }
                              else
                            {
                                  Console .WriteLine( "密码错误,登录失败"   );
                            }
                        }
                          else //reader返回false,就是没有查找到这个用户名
                        {
                              Console .WriteLine( "用户名错误"   );
                        }
                    }
                }
            }

9.close和dispose的区别
     sql的close连接关闭后还可以打开,必须Dispose注销掉就不能打开
     using在除了作用域以后调用Dispose, SqlConnection,FileStream等的Dispose内部都会做这样的判断:判断有没有close,如果没有Close就是先Close后再Dispose

10.注入漏洞与参数化查询
      using   ( SqlConnection   conn =   new   SqlConnection ( @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True;" ))
            {
                conn.Open();
                  using   ( SqlCommand   cmd = conn.CreateCommand())
                {
                    cmd.CommandText =   "select count(*) from T_User where UserName=@username and Password=@password" ;
                      //先到表中查询用户输入的用户名对应的信息
                    cmd.Parameters.Add(   new   SqlParameter   ( "username" ,UserName));
                    cmd.Parameters.Add(   new   SqlParameter   ( "password" ,Password));
                      int   i =   Convert   .ToInt32(cmd.ExecuteScalar());
                      if   (i > 0)
                    {
                          Console .WriteLine( "登陆成功"   );
                    }
                      else
                    {
                          Console .WriteLine( "登录失败"   );
                    }
                   
                }
            }

11.案例:用户登陆,登陆三次禁止登陆,用数据库记录错误次数
        private   void   IntErrorTime()
        {   //密码错误,进行errortime加1操作
              using   ( SqlConnection   conn =   new   SqlConnection ( @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\MYDB.mdf;Integrated Security=True;User Instance=True;" ))
            {
                conn.Open();
                  using   ( SqlCommand   updatecmd = conn.CreateCommand())
                {
                    updatecmd.CommandText =   "update T_User set ErrorTime=ErrorTime+1 where UserName=@userName" ;
                    updatecmd.Parameters.Add(   new   SqlParameter   ( "username" , txtbxUserName.Text));
                    updatecmd.ExecuteNonQuery();
                }
            }
        }

          private   void   ClearErroeTime()
        {   //登录成功,清楚errortime的值,恢复0
              using   ( SqlConnection   conn =   new   SqlConnection ( @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\MYDB.mdf;Integrated Security=True;User Instance=True;" ))
            {
                conn.Open();
                  using   ( SqlCommand   updatecmd = conn.CreateCommand())
                {
                    updatecmd.CommandText =   "update T_User set ErrorTime=0 where UserName=@userName"   ;
                    updatecmd.Parameters.Add(   new   SqlParameter   ( "username" , txtbxUserName.Text));
                    updatecmd.ExecuteNonQuery();
                }
            }
        }
          private   void   btnLand_Click( object   sender,   EventArgs   e)
        {
              using   ( SqlConnection   conn =   new   SqlConnection ( @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\MYDB.mdf;Integrated Security=True;User Instance=True;" ))
            {
                conn.Open();
                  using   ( SqlCommand   cmd = conn.CreateCommand())
                {
                    cmd.CommandText =   "select * from T_User where UserName=@username"   ;
                    cmd.Parameters.Add(   new   SqlParameter   ( "username" , txtbxUserName.Text));
                      using   ( SqlDataReader   reader = cmd.ExecuteReader())
                    {
                          if   (reader.Read())
                        {
                              int   errortime = reader.GetInt32(reader.GetOrdinal( "ErrorTime" ));
                              if   (errortime > 3)
                            {
                                  MessageBox .Show( "登录错误次数过多,禁止登录"   );
                                  return ;
                            }
                              string   dbpassword = reader.GetString(reader.GetOrdinal( "Password" ));
                              if   (dbpassword == txtbxPassword.Text)
                            {
                                ClearErroeTime();
                                  MessageBox .Show( "登录成功"   );
                            }
                              else
                            {
                                  //在同一个连接中如果SqlDataReader没有关闭,那么是不能执行update之类的语句的
                                  //using (SqlCommand updatecmd = conn.CreateCommand())
                                  //{
                                  //    updatecmd.CommandText = "update T_User ErrorTime=ErrorTime+1 where UserName=@userName ";
                                  //    updatecmd.Parameters.Add(new SqlParameter("username", txtbxUserName.Text));
                                  //    updatecmd.ExecuteNonQuery();
                                  //}
                                IntErrorTime();
                                  MessageBox .Show( "登录失败"   );
                            }
                        }
                          else
                        {
                              MessageBox .Show( "用户名不存在"   );
                        }
                    }
                }
            }
        }
12.案例手机号码归属地
  数据库乱码要注意:  设置类型nvarchar(50), 名字要设置N'浙江省'
  数据库连接字符串要写在配置文件,在使用是要先引用sys.configuration,再解析
      public   partial   class   Form1   :   Form
    {
          public   Form1()
        {
            InitializeComponent();
        }

          private   void   Form1_Load( object   sender,   EventArgs   e)
        {
              //设定CombBox的DisplayMember属性为Name
              using   ( SqlConnection   conn =   new   SqlConnection ( ConfigurationManager   .ConnectionStrings[ "ConnStr" ].ToString()))
            {
                conn.Open();
                  using   ( SqlCommand   cmd = conn.CreateCommand())
                {
                    cmd.CommandText =   "SELECT * FROM promary" ;
                      using   ( SqlDataReader   dr = cmd.ExecuteReader()) //只能逐行向前,无法回头,轻量级
                    {
                          while   (dr.Read())
                        {
                              ProvinceItem   item =   new   ProvinceItem ();
                            item.Name = dr.GetString(dr.GetOrdinal(   "proName" ));
                            item.Id = dr.GetInt32(dr.GetOrdinal(   "proID" ));
                            cmbbxPromary.Items.Add(item);
                        }
                    }
                }
            }
        }

          private   void   cmbbxPromary_SelectedIndexChanged(   object   sender,   EventArgs   e)
        {
            cmbbxCity.Items.Clear();
            cmbbxCity.SelectedItem =   null ;
              this .Refresh();
              //清空
              ProvinceItem   item = ( ProvinceItem   )cmbbxPromary.SelectedItem;
              int   proid = item.Id;
              //MessageBox.Show(item.Id.ToString());
              using   ( SqlConnection   conn =   new   SqlConnection ( ConfigurationManager   .ConnectionStrings[ "ConnStr" ].ToString()))
            {
                conn.Open();
                  using   ( SqlCommand   cmd = conn.CreateCommand())
                {
                    cmd.CommandText =   "SELECT * FROM city where proID=@proid"   ;
                    cmd.Parameters.Add(   new   SqlParameter   ( "proid" ,proid));
                      using   ( SqlDataReader   dr = cmd.ExecuteReader()) //只能逐行向前,无法回头,轻量级
                    {
                          while   (dr.Read())
                        {
                            cmbbxCity.Items.Add(dr.GetString(dr.GetOrdinal(   "cityName" )));
                        }
                    }
                }
            }
        }
    }
      public   class   ProvinceItem
    {
          public   string   Name {   get ;   set ; }
          public   int   Id {   get ;   set ; }
    }










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ADO.NET是微软公司针对数据库操作开发的技术框架。它是.NET框架的一部分,提供了一系列用于连接和操作数据库的类和API接口。 ADO.NET技术参考大全是指包含了ADO.NET框架的全部类、方法和属性的详细文档资料。这份资料一般由微软官方提供,用户可以在开发过程中查找与ADO.NET相关的各种技术问题和解决方案。 ADO.NET技术参考大全对于开发者来说非常重要。首先,它提供了完整的ADO.NET框架的文档,使开发者能够全面了解ADO.NET的各个方面,包括连接数据库、执行SQL语句、数据读取和更新、事务处理等。开发者可以根据这份文档,快速掌握ADO.NET的核心概念和用法。 其次,ADO.NET技术参考大全还包含了各种实际应用场景和最佳实践的示例代码,方便开发者学习和参考。这些示例代码可以帮助开发者更好地理解ADO.NET的用法,提高编程效率和质量。 此外,ADO.NET技术参考大全还提供了关于ADO.NET的性能优化、安全性、数据缓存和数据绑定等方面的详细说明,开发者可以根据自己的需求选择适合的技术和策略,提高程序的性能和安全性。 总之,ADO.NET技术参考大全是ADO.NET开发者必备的参考资料,它可以帮助开发者快速上手和深入学习ADO.NET技术,提高开发效率和代码质量。如果您想深入学习ADO.NET开发技术,强烈建议您查阅并参考ADO.NET技术参考大全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值