文档章节

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

o
 osc_1ee7cxmx
发布于 2018/08/06 16:15
字数 720
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 

转自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()进行资源管理;

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

格式编号始终显示2个小数位 - Format number to always show 2 decimal places

问题: I would like to format my numbers to always display 2 decimal places, rounding where applicable. 我想将数字格式化为始终显示2个小数位,并在适用的情况下四舍五入。 Examples...

富含淀粉
今天
22
0
Docker可视化工具Portainer

1 前言 从没想到Docker也有可视化的工具,因为它的命令还是非常清晰简单的。无聊搜了一下,原来已经有很多Docker可视化工具了。如DockerUI、Shipyard、Rancher、Portainer等。查看对比了一番...

南瓜慢说
今天
20
0
日志系统新贵 Loki,真香!!

最近,在对公司容器云的日志方案进行设计的时候,发现主流的ELK或者EFK比较重,再加上现阶段对于ES复杂的搜索功能很多都用不上最终选择了Grafana开源的Loki日志系统,下面介绍下Loki的背景。...

庞陆阳
今天
14
0
jQuery获取select onChange的值 - jQuery get value of select onChange

问题: I was under the impression that I could get the value of a select input by doing this $(this).val(); 我的印象是我可以通过执行$(this).val();来获取选择输入的值$(this).val()......

javail
今天
13
0
道翰天琼解密宇宙信息大脑三者最核心奥秘,破解认知智能基础理论(群聊形式)

三体论是探索研究宇宙,信息和人类大脑三者关系的理论体系。是认知智能的奠基理论体系之一。宇宙和信息,信息和人类大脑,人类大脑和宇宙,三者之间存在着某种未被完全揭示的奥秘。三体论的核...

jackli2020
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部