zoukankan      html  css  js  c++  java
  • C#与数据库访问技术总结(五)之Command对象的常用方法

    Command对象的常用方法

       说明:上篇总结了Command对象的几个数据成员,这节总结Command对象的常用方法。

      同样,在不同的数据提供者的内部,Command对象的名称是不同的,在SQL Server Data Provider里叫SqlCommand,而在OLE DB Data Provider里叫OleDbCommand。

        下面将详细介绍Command类型对象的常用方法,包括构造函数、执行不带返回结果集的SQL语句方法、执行带返回结果集的SQL语句方法和使用查询结果填充DataReader对象的方法。

        1.构造函数

    构造函数用来构造Command对象。对于SqlCommand类型的对象,其构造函数说明如表 2-6所示。

    函数定义 

      参数说明

    函数说明

    SqlCommand()

    不带参数

    创建SqlCommand对象

    SqlCommand(string cmdText)

     cmdText: SQL 语句字符串

    根据SQL语句字符串,创建SqlCommand对象 

    SqlCommand(string cmdText, SqlConnection connection)

    cmdText: SQL 语句字符串

    connection: 连接到的数据源

    根据数据源和SQL语句,创建SqlCommand对象

    SqlCommand(string cmdText, SqlConnection connection,  SqlTransaction transaction)

    cmdText: SQL语句字符串

    connection: 连接到的数据源

    transaction: 事务对象

    根据数据源和SQL语句和事务对象,创建SqlCommand对象

    (1) 第一个构造函数不带任何参数

      SqlCommand  cmd=newe SqlCommand();
    
      cmd.Connection=ConnectionObject;
     
    string CommandText=" select *from studentInfo "; cmd.CommandText
    =CommandText;

    上面代码段使用默认的构造函数创建一个SqlCommand对象。然后,把已有的Connection对象ConnectionObject和命名文本CommandText分别赋给了Command对象的Connection属性和CommandText属性。      

    除此之外,许多关系型数据库,例如SQL Server 和Oracle,都支持存储过程。可以把存储过程的名称指定为命名文本。例如,使用编写 GetAllStudent存储过程为命名文本:

    string CommandText=" GetAllStudent ";
    
    cmd.CommandType=CommandType.StoredProcedure;
    cmd.CommandText=CommandText;

    (2) 第二个构造函数可以接受一个命令(SQL)文本

     string CommandText=" select *from studentInfo "; 
    
      SqlCommand  cmd=newe SqlCommand(CommandText);
    
      cmd.Connection=ConnectionObject;

    上面的代码实例化了一个Command对象,并使用给定命令文本对Command对象的CommandText属性进行了初始化。

    然后,使用已有的Connection 对象对Command对象的Connection属性进行了赋值。(这种方法在上一篇说过,不建议使用,使用最多的是下面的方法)

    (3) 第三个构造函数接受一个Connection和一个命名文本

      SqlCommand  cmd=newe SqlCommand(CommandText, ConnectionObject);

    注意这两个参数的顺序,第一个为string类型的命令文本,第二个为Connection对象。

    (4) 第四个构造函数接受三个参数,第三个参数是SqlTransaction对象,这里不做讨论。

    另外,Connection 对象提供了CreateCommand方法,该方法将实例化一个Command对象,并将其Connection属性赋值为建立该Command对象的Connection对象。

    无论在什么情况下,当把Connection对象赋值给Command对象的Connection属性时,并不需要Connection对象是打开的。但是,如果连接没有打开,则在命令执行之前必须首先打开连接。

    而对于OleDbCommand类型的对象,其构造函数如下表所示。同样可以看出,它们和SqlCommand类的构造函数非常相似。

    函数定义

    参数说明

    函数说明

    OleDbCommand()

    不带参数

    创建OleDbCommand对象

    OleDbCommand(string cmdText)

    cmdText: SQL语句字符串

    根据SQL语句字符串,创建OleDbCommand对象

    OleDbCommand(string cmdText,OleDbConnection connection)

    cmdText: SQL语句字符串

    connection:连接到的数据源

    根据数据源和SQL语句,创建OleDbCommand对象

    OleDbCommand(stringcmdText, OleDbConnection connection ,

    OleDbTransaction transaction)

    cmdText: SQL语句字符串

    connection:连接到的数据源

    transaction:事务对象

    根据数据源和SQL语句和事务对象,创建OleDbCommand对象

    命令对象构造完成后,就可以执行命令对数据库进行操作了。命令对象所提供的用于执行命令的方法有很多种,具体使用哪个方法取决于命令的执行结果返回什么样的数据。

    SqlCommand 提供了4个执行方法:ExecuteNonQuery()、ExecuteScalar()、ExecuteReader()、ExecuteXmlReader()。

    详细见下面相关部分。

    命令对象提供的用于执行命令的方法及其含义如表

    方法

    含义

    Cancel

    试图取消命令的执行

    ExecuteNonQuery

    对连接执行SQL语句并返回受影响的行数

    ExecuteReader

    执行查询,将查询结果返回到数据读取器(DataReader)中

    ExecuteScalar

    执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行

    ExecuteXmlReader

    执行查询,将查询结果返回到一个XmlReader对象中

      

     

    2.ExecuteNonQUery方法

    ExecuteNonQuery方法用来执行Insert、Update、Delete等非查询语句和其他没有返回结果集的SQL语句,并返回执行命令后影响的行数。

    如果Update和Delete命令所对应的目标记录不存在,返回0。如果出错,返回-1。

    String cnstr="server=(local);database=student; Integrated Security=true";
    
    SqlConnection cn=new SqlConnection(cnstr);
    
    cn.Open();
    
    string sqlstr="update student set  name='Jone' where name='Bill' ";
    
    SqlCommand cmd=new SqlCommand(sqlstr, cn);
    
    cmd.ExecuteNonQuery();
    
    cn.Close();

    3.ExecuteScalar()方法

        在许多情况下,需要从SQL语句返回一个结果,例如客户表中记录的个数,当前数据库服务器的时间等。

        ExecuteScalar方法执行一个SQL命令,并返回结果集中的首行首列(执行返回单个值的命令)。如果结果集大于一行一列,则忽略其他部分。

      根据该特性,这个方法通常用来执行包含Count、Sum等聚合函数的SQL语句。

    下面的代码读取数据库中表student的记录个数,并把它输出到控制台上。
    
    String cnstr="server=(local);database=student; Integrated Security=true";
    
    SqlConnection cn=new SqlConnection(cnstr);
    
    cn.Open();
    
    string sqlstr="select count(*) from student";
    
    SqlCommand cmd=new SqlCommand(sqlstr, cn);
    
    object count=cmd.ExecuteScalar();
    
    Console.WriteLine(count.ToString());
    
    cn.Close();
    
    ExecuteScalar()方法的返回值类型是Object,根据具体需要,可以将它转换为合适的类型。

        4.ExecuteReader()方法

        ExecuteReader()方法执行命令,并使用结果集填充DataReader对象

        ExecuteReader()方法用于执行查询操作,它返回一个DataReader对象,通过该对象可以读取查询所得的数据。

        ExecuteReader()方法在Command对象中用得比较多,通过DataReader类型的对象,应用程序能够获得执行SQL查询语句后的结果集。

      该方法的两种定义为:

           †ExecuteReader(),不带参数,直接返回一个DataReader结果集。

        †   ExecuteReader(CommandBehavior behavior),根据behavior的取值类型,决定DataReader的类型。

          如果behavior取值是CommandBehavior.SingleRow这个枚举值,则说明返回的ExecuteReader只获得结果集中的第一条数据。

        如果取值是CommandBehavior.SingleResult,则说明只返回在查询结果中多个结果集里的第一个

      一般来说,应用代码可以随机访问返回的ExecuteReader列,

      但如果behavior取值为 CommandBehavior.SequentialAccess,则说明对于返回的ExecuteReader对象只能顺序读取它包含的列。

      也就是说,一旦读过该对象中的列,就再也不能返回去阅读了。这种操作是以方便性为代码换取读数据时的高效率,需谨慎使用。

    String cnstr="server=(local);database=student; Integrated Security=true";
    
    SqlConnection cn=new SqlConnection(cnstr);
    
    cn.Open();
    
    string sqlstr="select * from student";
    
    SqlCommand cmd=new SqlCommand(sqlstr, cn);
    
    SqlDataReader dr=cmd.ExecuteReader();//建立SqlDataReader 对象
    
    while(dr.Read())//循环输出每一条记录
    
    {
    
        String name=dr["姓名"].ToString();//读取姓名子段
    
        Console.WriteLine(name);//控制台输出
    
    }
    
    dr.Close();//关闭结果集
    
    cn.Close();//关闭数据库连接
    这段代码从数据库的student表中读取全部数据,并把该表的“姓名”字段的数据全部输出到控制台上。

    ExecuteXmlReader 

    SqlCommand特有的方法,OleDbCommand无此方法。该方法执行将返回XML字符串的命令。它将返回一个包含所返回的XML的System.Xml.XmlReader对象。

  • 相关阅读:
    维度漫谈
    维度漫谈
    世界名曲
    世界名曲
    音乐的要素
    音乐的要素
    POJ 1300 欧拉通路&欧拉回路
    C库函数笔记
    malloc()参数为0的情况
    层层递进Struts1(三)之Struts组成
  • 原文地址:https://www.cnblogs.com/zi-xing/p/4029439.html
Copyright © 2011-2022 走看看