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语句内部是调用了存储过程)

 

 

 


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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。