A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

对于手写SQL连接中,经常会用到ExecuteNonQuery, ExecuteScalar, ExecuteReader, DataSet
它们的区别如下
1. ExecuteNonQuery 方法
用法:ExecuteNonQuery方法用来执行 INSERT、UPDATE、DELETE和其他没有返回值得SQL命令,——比如CREATEDATABASE 和 CREATE TABLE 命令。当使用 INSERT、UPDATE、DELETE时,ExecuteNonQuery返回被命令影响的行数。

代码
            using (SqlConnection con = new SqlConnection(constr))
            {
                con.Open();
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandText = sql;\\sql为 insert、update、delete等不需要返回数据的SQL语句
                    cmd.ExecuteNonQuery();
                }
            }

2.ExecuteScalar 方法
ExecuteScalar方法执行一个SQL命令返回结果集的第一列的第一行。它经常用来执行SQL的COUNT、AVG、MIN、MAX 和 SUM 函数,这些函数都是返回单行单列的结果集。主要是用于数量的统计,比如select count(*) from table,select avg(name) from table

代码如下
using (SqlConnection con = new SqlConnection(constr))
            {
                con.Open();
                using (SqlCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = "select count(*) from message";\\主要用在一些需要返回计算结果SQL语句中
                    int sum = (int)cmd.ExecuteScalar();   
                    MessageBox.Show(sum.ToString());         
                }
            }


3.ExecuteReader 方法
用法:ExecuteReader 方法存在的目的只有一个:尽可能快地对数据库进行查询并得到结果。ExecuteReader 返回一个DataReader对象:如果在SqlCommand对象中调用,则返回SqlDataReader;如果在OleDbCommand对象中调用,返回的是OleDbDataReader。可以调用DataReader的方法和属性迭代处理结果集。它是一个快速枚举数据库查询结果的机制,是只读、只进。对SqlDataReader.Read的每次调用都会从结果集中返回一行。

代码
using (SqlConnection con = new SqlConnection(constr))
            {
                con.Open();
                using (SqlCommand cmd = con.CreateCommand())
                {
                      cmd.CommandText="select * from message";
                      using(SqlDataReader reader=cmd.ExecuteReader())
                            {
                                while (reader.Read())\\因为ExecuteReader查询完的结果是在数据库里面的,并不是返回到客户端,所以请求ExecuteReader查询结果时,只能一行一行的向数据库服务器申                          请,当reader.Read()=true证明还有数据,当reader.Read()=false时表示上回读取的是最后一行数据
                                {
                                    string name=reader.GetString(2);
                                    MessageBox.Show(name);
                                }
                            }
                }
            }
3.DataSet 方法
与ExecuteReader 类似,都能查询表数据。但是也不尽相同,DataSet 查询的结果返回到客户端而ExecuteReader查询结果在服务器上, DataSet可以返回一个表的数据类型(DataTable),ExecuteReader只能逐行申请数据并不能直接查询整个表的数据。
代码
using (SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=lianxi;User ID=sa;Password="))
            {
                con.Open();
                using (SqlCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = "select * from message";
                    SqlDataAdapter ad=new SqlDataAdapter(cmd);\\执行SQL返回数据
                    DataSet ds=new DataSet();\\定义DataSet
                    ad.Fill(ds);\\用返回的数据填充DataSet
                    DataTable dt=ds.Tables[0];\\读取表0的数据,杨老师说DataSet中可以放多个表,但是大部分的用法就是只有一个表,所以每次读取Tables[0]就可以了
                    GridView1.datasource=dt;\\将表数据绑定GridView控件,但是这是个效果展示,杨老师很不推荐这样写,支持手写绑定数据DataGrid!
                }
            }


歇会去。。  欢迎各位讨论学习和批评指正 {:soso_e162:}

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

2 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
  1. public SqlDataReader ExecuteReader(string sql)
  2.         {
  3.             using (SqlConnection conn = new SqlConnection(constr))
  4.             {//到数据库的连接
  5.                 conn.Open();
  6.                 using (SqlCommand cmd = conn.CreateCommand())
  7.                 {//cmd
  8.                     
  9.                     cmd.CommandText = sql;
  10.                     
  11.                     return cmd.ExecuteReader();
  12.                     
  13.                 }
  14.             }
  15.         }
复制代码
比方我把executereader用sqlhelper封装起来了,调用的时候返回一个sqldatareader,然后用while循环,会产生错误,这个办法要怎么解决呢
http://bbs.itheima.com/thread-39115-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马