黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )

 

转自https://blog.csdn.net/u010796875/article/details/17386131

 

一.执行有多行结果集的用ExecuteReader

SqlDateReader reader=cmd.ExecuteReader();//查询结果在数据库中,不占客户端电脑内存

While(reader.Reader()){

   Console.WriteLine(reader.GetString(1));

}

//初始指针指向第一条数据之前,每调用一次Reader(),指针下移一条,只要没有移到最后一条之后,就返回true;

   private void Button_Click(object sender, RoutedEventArgs e)

        {

            using (SqlConnection conn = new SqlConnection("server=.;database=ADO.NET;uid=sa;pwd=***"))

            {

                conn.Open();

                using (SqlCommand com = conn.CreateCommand())

                {

                    //需要执行的T-sql语句

                    com.CommandText = "select * from T_User";

                    //执行查询语句并获取数据集

                    using (SqlDataReader read = com.ExecuteReader())

                    {

                        while (read.Read())

                        {

                            //read作为服务器端查询的数据集,

                            //通过调用方法:read.Get要查找的数据类型(第几列)

                            string username = read.GetString(1);

                            string userpwd = read.GetString(2);

                            MessageBox.Show(username+","+userpwd);

                        }

                    }

                }

            }

        }

二.Sql注入与参数添加

//SQL注入例子:1'or '1'='1

cmd.CommandText = "select Userpwd from T_User where UserName='"+txtName.Text+"'";

//防止sql注入,使用参数更加严密:

   string name = this.textBox1.Text;

   string pwd = this.textBox2.Text;

            using (SqlConnection conn = new SqlConnection("server=.;database=ADO.NET;uid=sa;pwd=***"))

            {

                conn.Open();

                using (SqlCommand cmd = conn.CreateCommand())

                {

                    cmd.CommandText = "select * from T_User where UserName=@username and UserPwd=@userpwd";

                    cmd.Parameters.Add(new SqlParameter("@username",name));

                    cmd.Parameters.Add(new SqlParameter("@userpwd", pwd));

                    using (SqlDataReader read = cmd.ExecuteReader())

                    {

                        if (read.Read())

                        {

                            MessageBox.Show("登陆成功");

                        }

                        else

                        {

                            MessageBox.Show("登陆失败");

                        }

                    }

                   

                }

            }

三.DataSet

1.SqlDataReader是连接相关的,SqlDataReader中的查询结果并不是放在程序中的,而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),只能读取当前游标指向的行,一旦连接断开就不能再读取。这样的好处就是无论查询结果有多少条,对程序占用的内存几乎没有影响;

2.SqlDataReader对于小数据量的数据来说带来的只有麻烦。ADO.Net中提供了数据集的机制,将查询结果集填充到本地内存中,这样连接中断,不会影响数据的读取,数据集的好处是降低数据库服务器压力,编程也简单

3.DataSet的用法:

  using (SqlConnection conn = new SqlConnection("server=.;database=ADO.NET;uid=sa;pwd=***"))

            {

                conn.Open();

                using (SqlCommand cmd = conn.CreateCommand())

                {

                    cmd.CommandText = "select * from T_User";

                    SqlDataAdapter sda = new SqlDataAdapter(cmd);

                    DataSet ds = new DataSet();

                    sda.Fill(ds);

                    DataTable dt = ds.Tables[0];

                    for (int i = 0; i < dt.Rows.Count; i++)

                    {

                        string name = dt.Rows[i][1].ToString();

                        MessageBox.Show(name);

                    }  

                }

            }

 

四.总结DataSet与SqlDataReader 

DataSet 是通过SqlDataAdapter类通过cmd查询的数据集,它是放在客户端内存中,SqlDataReader是执行cmd.ExecuteReader()查询语句所获得的数据集,它是放在数据库服务器端的,两者各有利弊,总的来说,如果数据集较小,则使用DataSet好,如果数据集非常大,还是在数据库中的好,无论哪一种都是需要连接数据库的,所以都要使用Using()查询完以后自动关闭连接。

 

SqlDataReader类,SqlDataAdapter类都是是实现了IDisposable接口(这个接口自动关闭连接),所以也要像SqlConnection类,SqlCommand类一样使用Using()进行资源管理;

posted @ 2018-08-06 16:15  IT路上的小白  阅读(410)  评论(0编辑  收藏  举报