• ADO.NET知识的运用一(Day 26)


       哈哈,又到了总结的时间了,来回顾一下今天主要学了关于ADO.NET的哪些知识吧。(这次学的ADO访问数据库主要以访问SQL数据库为主)

    理论:

     首先我们要知道为什么要学习ADO.NET?

    因为我们之前所学只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,所以我们搭建一个界面(web或winform)让用户方便的操作数据库中的数据

    什么是ADO.NET?

    ADO.NET就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像System.IO下的类操作文件一样, System.Data.这组类是用来操作数据库(不光是MSSql Server),它提供了统一的编程接口让操作其它数据库(AccessOracle)的方式和操作MSSql Server一致

    ADO.NET组成
    —数据提供程序(常用类)
     
    Connection连接对象,用来连接数据库
     
    Command:  命令对象,用来执行SQL语句并返回结果
     
    DataReader数据读取器对象,只读、只进的结果集,一条一条读取数据(StreamReader、XmlReader微软的类库中这些Reader的使用方式都差不多)
     
    DataAdapter读取适配器对象,用来执行SQL语句并返回结果在DataSet与数据源之间建立通道,将数据源中的数据写入DataSet中,或者根据DataSet中的数据更新数据源。俗称“数据搬运工”
     
    —DataSet    :   数据集对象,在内存中的临时数据库,是一个虚拟的数据源。利用数据适配器所执行的SQL命令或存储过程来填充数据。一旦填充后就可以断开与数据源的连接
     
     
    ADO.NET的其他常见类
     
    —ConnectionStringBuilder           自动生成连接字符串
    —Parameter                                 带参数的SQL语句
    —Transaction                               在ADO.NET中使用事务
     
    —与DataSet相关的类
     
    DataView                   视图类,DataTable中的数据以不同的视角查看
    DataRowView             DataView中的行。
    DataTable                   DataSet中的数据表
    DataRow                    DataTable中的行
    DataColumn              DataTable中的列
    DataRealation           DataTable与DataTable的关系
    onstraint                   DataTable中建立的约束
     
    ADO.NET各类在开发中的职能
      

    ADO.NET访问数据库的方式(有两种)

    —方式一:
     
    1.连接数据用Connection
     
    2.执行SQL语句Command
     
    3.执行完毕之后将结果一条一条返回。DataReader
     
    —方式二:
     
    使用DataAdapter+DataSet,这种方法本质还是通过Connection、Command、DataReader将数据全部取出来然后放到了DataSet中
     
    实操:
     
    在做项目之前首先要引进命名空间using System.Data.SqlClient;
     
    1.插入数据
     
     
    主要代码:
     static void Main(string[] args)
            {
                //创建连接字符串
    
                string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True";
    
                //打开连接
    
                using (SqlConnection conn = new SqlConnection(connstr))
                
                {
                    conn.Open();
    
                    //执行数据库操作
    
                    string sql = "insert into info values('jany',19,'女','123456')";
    
                    using (SqlCommand comm = new SqlCommand(sql, conn))   //创建命令对象
                    {
                        int i = comm.ExecuteNonQuery();                //执行对数据库的增删改,返回受影响的行数
    
                        if (i > 0)
                        {
                            Console.WriteLine("插入成功");
    
                        }
                        else
                        {
                            Console.WriteLine("插入失败");
                        }
                       
                    } 
                    Console.ReadKey();
                }
            }

     结果:


     

    2. 更新数据(删除数据类似于更新数据和插入数据,只是执行的sql语句不一样而已)

    static void Main(string[] args)
            {
                //创建连接字符串
    
                string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True";
    
                //打开连接
    
                using (SqlConnection conn = new SqlConnection(connstr))
                
                {
                    conn.Open();
    
                    //执行数据库操作
    
                    string sql = "update info set name='rose' where id=4";
    
                    using (SqlCommand comm = new SqlCommand(sql, conn))   //创建命令对象
                    {
                        int i = comm.ExecuteNonQuery();           //执行对数据库的增删改,返回受影响的行数
    
                        if (i > 0)
                        {
                            Console.WriteLine("更新成功");
    
                        }
                        else
                        {
                            Console.WriteLine("更新失败");
                        }
                       
                    } 
                    Console.ReadKey();
                }
            }

    结果:

    3.读取数据(运用SqlDataReader)

    static void Main(string[] args)
            {
             
                //创建连接字符串
                string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True";
    
                using (SqlConnection conn = new SqlConnection(connstr))
                {
                    conn.Open();   //打开连接
    
                    string sqltext = "select * from 职工";
    
                    using (SqlCommand comm = new SqlCommand(sqltext, conn))
                    {
                        using (SqlDataReader sda = comm.ExecuteReader()) //创建数据读取器,获取SqlDataReader的对象
                        {
                            while (sda.Read())   //一条一条来读取
                            {
                                Console.WriteLine("职工ID{0},职工号{1},仓库号{2},姓名{3},性别{4},工资{5}", sda[0], sda[1], sda[2], sda[3], sda[4], sda[5]);
                            }
    
                            Console.ReadKey();
                        }
                    }
                }

     结果:

    3.DataSet运用(窗体程序)

    首先设计窗体界面

    主要代码:

    private void Form1_Load(object sender, EventArgs e)
            {
                //创建连接字符串
                string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True";
               
                //打开连接
                using (SqlConnection conn = new SqlConnection(connstr))
                {
                    conn.Open();
    
                    //执行数据库操作
                    string sqltext = "Select * from 职工";
                    using (SqlCommand comm = new SqlCommand(sqltext, conn)) //创建命令对象
                    {
                        DataSet sds = new DataSet();    //创建数据集
    
                        using (SqlDataAdapter sda= new SqlDataAdapter(comm) )  //创建数据适配器
                        {
                     
                            
                            sda.Fill(sds);   //填充数据
                        }
    
                        this.dataGridView1.DataSource =sds.Tables[0];     //绑定数据
    
                    }
    
                }
            }


    结果:

    4.用户登录(窗体程序)

    窗体界面

    主要代码:

    private void btnok_Click(object sender, EventArgs e)
            {
                string user = this.txtname.Text;
                string pwd = this.txtpwd.Text;
                //创建连接字符串
                string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True";
    
                //打开连接
                using (SqlConnection conn = new SqlConnection(connstr))
                {
                    conn.Open();
    
                    //执行数据库操作。 (向SqlCommand的Parameters中添加参数)
                    string sqltext = "select * from info where name=@user and  pwd=@pwd";
                    SqlParameter sp = new SqlParameter("@user", user);   
                    SqlParameter sp1 = new SqlParameter("@pwd", pwd);
    
                    using (SqlCommand cmd = new SqlCommand(sqltext, conn))  
                    {
                        cmd.Parameters.Add(sp);
                        cmd.Parameters.Add(sp1);
    
                        DataTable dt = new DataTable(); //表示一个内存中数据表
    
                        using (SqlDataAdapter sda = new SqlDataAdapter(cmd))   //创建数据适配器
                        {
                            sda.Fill(dt);          //填充数据
                        }
                        if (dt.Rows.Count > 0)
                        {
                            MessageBox.Show("登陆成功");
                        }
                        else
                        {
                            MessageBox.Show("登录失败");
                        }
                    }
                    
                }
            }
    
            private void btnclo_Click(object sender, EventArgs e)
            {
                this.txtname.Text= "";
                this.txtpwd.Text = "";
    
            }

    运行结果:

    补充:

    SQL注入漏洞攻击

    —登录判断:select * from T_Users where UserName=... and Password=...,将参数拼到SQL语句中。
    —构造恶意的Password:hello' or 1=1 --
     
    —                      if (dataReader.Read())
     
    —                        {
    —                            MessageBox.Show("登陆成功");
    —                        }
    —                        else
    —                        {
    —                            MessageBox.Show("登陆失败");
    —                        }
    —防范注入漏洞攻击的方法:不使用SQL语句拼接,通过参数赋值

    参数在SQLServer内部不是简单的字符串替换,SQLServer直接用添加的值进行数据比较,因此不会有注入漏洞攻击。(带参数的sql语句内部是调用了存储过程)


    呵呵,今天就先写到这里吧。其他的一些知识等用到的时候在记录下来吧。加油!

  • 相关阅读:
    Django项目实战之用户头像上传与访问
    ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
    《http权威指南》读书笔记13
    《http权威指南》读书笔记12
    《http权威指南》读书笔记11
    《http权威指南》读书笔记10
    《http权威指南》读书笔记9
    移动端帧动画抖动解决方案
    display: table-cell的实用应用
    《http权威指南》读书笔记8
  • 原文地址:https://www.cnblogs.com/ysaw/p/4156365.html
Copyright © 2020-2023  润新知