• 黑马程序员_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()进行资源管理;

  • 相关阅读:
    Java实现蓝桥杯 九宫幻方
    Java实现蓝桥杯 九宫幻方
    Java实现蓝桥杯 九宫幻方
    Java实现蓝桥杯 九宫幻方
    Java实现蓝桥杯 历届试题 合根植物
    dddd
    隋唐英雄第70集和第90集的片头真有意思
    造成远程文件大小为零的原因(索引值里变成了0)
    QDataStream类参考(串行化数据,可设置低位高位,以及版本号),还有一个例子
    房价收入比大幅攀升,已经达到足以傲视全球的境界,这已是大家的共识(好几段评论都非常精彩)
  • 原文地址:https://www.cnblogs.com/cb1186512739/p/9430867.html
Copyright © 2020-2023  润新知