您的位置:首页 > 编程学习 > ASP.NET > 正文

ExecuteNonQuery、ExecuteScalar、ExecuteReader区别

更多 时间:2014-5-9 类别:编程学习 浏览量:599

ExecuteNonQuery、ExecuteScalar、ExecuteReader区别

ExecuteNonQuery、ExecuteScalar、ExecuteReader区别

ExecuteNonQuery()

执行命令对象的SQL语句,返回一个int变量,如果sql语句是对数据库的记录进行操作(insert, delete, update),那么将返回操作所影响的记录条数。对于其他类型的语句,返回值为-1.如果发生回滚,返回值也为-1.

 

ExecuteScalar()

执行命令对象的SQL语句,如果是select,则仅返回查询结果集中的第一行第一列,而忽略其他的行和列。该方法返回的结果为object类型,在使用之前必须强制转换为所需类型。如果sql语句不是select,则返回未实例化对象,因为对象未实例化,所以返回结果不能ToString(),不能Equals(null),即返回结果没有任何作用。当只需返回一个单独的数据元时,则可以使用此方法来提高代码的性能,常用于执行聚合函数。

 

ExecuteReader()

如果是select,返回查询结果的集合,类型是DataReader(OleDbDataReader, SqlDataReader, OracleDataReader等)。它提供了“游水”式的执行方式,即从结果中读取一行之后,移动到另一行,前一行无法再用。有一点需要注意的是,要等到手动调用Read()方法之后,DataReader对象才会移动到结果集的第一行,同时此方法也返回一个bool值,true表示下一行可用,false表示到达结果集末尾。

如果不是select语句,则返回一个没有任何数据的DataReader类型的集合(EOF)。

使用DataReader可以提高执行效率,有两种方式可以提高代码的性能:一是基于序号的查找,一是使用适当的Get方法查找。因为查询出来的结果一般都不会改变,除非再次改动查询语句,因此可以通过定位列的位置来查找记录。用这种方法有一个问题,有可能知道一列的名称而不知其所在的位置,可以通过DataReader的GetOrdinal()方法,次方法接收一个列名并返回此列名所在的列号。

 

 

实例

1、 增加新的记录

  •  
  • C# 代码   复制
  • 
    private void Page_Load(object sender, System.EventArgs e) 
    { 
       MyConnection.Open();’打开数据库 
       MyCommand1.CommandText = "insert into admin values(‘aaddq‘,‘as‘,‘ss‘)"; 
       MyCommand1.Connection = MyConnection; 
       MyCommand1.ExecuteNonQuery();’由于增加了一条记录,所以返回1 
       //或者MyCommand1.ExecuteReader();先增加一条记录,然后返回一个   
       System.Data.OleDb.OleDbDataReader类型的对象,该对象为:EOF 
       //或者MyCommand1. ExecuteScalar();先增加一条记录,返回未实列化的对象 
       MyConnection.Close(); 
    } 
    
    		
  •  

    2、 删除现有数据

  •  
  • C# 代码   复制
  • 
    private void Page_Load(object sender, System.EventArgs e) 
    { 
       MyConnection.Open();’打开数据库 
       MyCommand1.CommandText = "delete * from admin"; 
       MyCommand1.Connection = MyConnection; 
       MyCommand1.ExecuteNonQuery();’由于删除了n条记录,所以返回n 
       //或者MyCommand1.ExecuteReader();先删除n条记录,然后返回一个System.Data.OleDb.OleDbDataReader类型的对象,该对象为:EOF 
       //或者MyCommand1. ExecuteScalar();先删除n条记录,返回未实列化的对象 
       MyConnection.Close(); 
    } 
    
    		
  •  

    3、 修改现有数据

  •  
  • C# 代码   复制
  • 
    private void Page_Load(object sender, System.EventArgs e) 
    { 
       MyConnection.Open();’打开数据库 
       MyCommand1.CommandText = "update admin set admin_code=’212’,Admin_pwd=’43’ where admin_code=’23’"; 
       MyCommand1.Connection = MyConnection; 
       MyCommand1.ExecuteNonQuery();’由于修改了1条记录,所以返回n 
       //或者MyCommand1.ExecuteReader();先修改了1条记录,然后返回一个System.Data.OleDb.OleDbDataReader类型的对象,该对象为:EOF 
       //或者MyCommand1. ExecuteScalar();先修改了1条记录,返回未实列化的对象 
       MyConnection.Close(); 
    } 
    
    		
  •