首页 > 编程 > .NET > 正文

ADO.NET读书笔记系列之------SqlCommander和SqlDataReader对象

2024-07-21 02:06:30
字体:
来源:转载
供稿:网友

一、特点介绍

⒈sqlcommand:表示要对sql server数据库执行的一个transact-sql语句或存储过程。

⒉sqldatareader:提供一种从数据库读取只进的行流的一种方式。若要创建sqldatareader,必须调用sqlcommand对象的executereader方法,而不直接使用构造函数。应该尽可能迅速的关闭sqldatareader对象。

⒊sqlparameter:表示sqlcommand的参数,也可以是它到dataset列的映射。

 

二、使用介绍

⒈创建sqlcommand对象:

    string strconn,strsql;

    strconn=”…………”;

    strsql=”select customerid,companyname from customers”;

    sqlconnection cn = new sqlconnection(strconn);

    cn.open();

    sqlcommand cmd;

   

    cmd=new sqlcommand();

    cmd.commandtext=strsql;

    cmd.connection=cn;

 

    cmd=new sqlcommand(strsql,cn); 

⒉执行无返回行的查询:

    string strconn,strsql;

    strconn=”……”;

strsql=”update customers set companynme=’newname’where customersid=’alfki’”;

    sqlconnection cn=new sqlconnection(strconn);

    cn.open();

    sqlcommand cmd=new sqlcommand(strsql,cn);

    int recordsaffercted=cmd.executenonquery();

    if(recordsaffercted ==1)

       ……

    else

      …………

⒊用sqldatareader对象检查查询结果:

①    获取结果

string strconn,strsql;

  strconn=”……”;

    sqlconnection cn=new sqlconnection(strconn);

  cn.open();

  strsql=”select customerid,companyname from customers”;

    sqlcommand cmd=new sqlcommand(strsql,cn);

sqldatareader rdr=cmd.executereader();

     while(rdr.read())

      console.writeline(rdr[“customerid”]+rdr[“companyname”]);

  rdr.close(); 

②    更快获取

ⅰ使用基于序号的查找

    ……

    sqldatareader rdr=cmd.executereader();

    int customeridordinal = rdr.getordinal(“customerid”);

    int companynameordinal = rdr.getordinal(“companyname”);

    while(rdr.read())

        console.writeline(rdr[customeridordinal]+rdr[companynameordinal]);

    rdr.close();

ⅱ使用适当的类型指定get方法

    ……

    sqldatareader rdr=cmd.executereader();

    int customeridordinal = rdr.getordinal(“customerid”);

   int companynameordinal = rdr.getordinal(“companynameordinal”);

    while(rdr.read())

        console.writeline(rdr.getstring(customeridordinal)+rdr.getstring(companynameordinal));

    rdr.close(); 

③获取多个结果

    …

    cn.open();

    string strsql =”select customerid,companyname from customers;”+“select orderid,customerid from orders;”;

    sqlcommand cmd=new sqlcommand(strsql,cn);

    sqldatareader rdr=cmd.executereader();

    do

    {

        while(rdr.read())

           console.writeline(rdr[0]+rdr[1]);

        console.writeline();

    }while(rdr.nextresult()); 

⒋执行返回单值的查询:

    …

    cn.open();

    sqlcommand cmd=new sqlcommand(“select count(*) from customers",cn);

    int customres = convert.toint32(cmd.executescalar());   

⒌执行参数化查询和调用存储过程:

    sqlcommand cmd = new sqlcommand("delqxry", cn);

    cmd.commandtype = commandtype.storedprocedure;

    sqlparameter parameterroleid = new sqlparameter("@id", sqldbtype.int, 4);

    parameterroleid.value = 444;

    cmd.parameters.add(parameterroleid);  

    cn.open();

    cmd.executenonquery(); 

⒍ 从 输出参数中获取数据:

    create procedure getcustomer(@companyname nvarchar(30) output,@customerid nchar(5)) as select @companyname=companyname from customers where [email protected]

    …

cmd.parameters[“@companyname”].direction =parameterdirection.output; 

 

⒎在transaction中执行查询:

    …

    cn.open();

    sqltransaction txn=cn.begintransaction();

    string strsql=”insert into customers(…)values(…)”;

    sqlcommand cmd=new sqlcommand(strsql,cn,txn);

    int recordaffected = cmd.executenonquery();

    if(recordaffected ==1)

    {

        txn.commit();

    }

    else

    {

        txn.rollback();

    }

 

三、属性方法事件介绍

⒈sqlcommand

ⅰ属性

    ①commandtext: 要执行的 transact-sql 语句或存储过程。默认为空字符串。

    ②commandtimeout: 等待命令执行的时间(以秒为单位)。默认为 30 秒。

    ③commandtype: commandtype 值之一。默认值为 text。



    ④connection: 与数据源的连接。默认值为空引用

    ⑤parameters: transact-sql 语句或存储过程的参数。默认为空集合。

    ⑥transaction:指定用于查询的事务处理

    ⑦updaterowsource:如果通过调用dataadapter对象的update方法来使用command,那么该属性就用于控制影响当前datarow的查询结果(默认值为both)

 

ⅱ方法

①cancel: 试图取消sqlcommand的执行。如果没有要取消的内容,则什么都不会发生。但如果有命令正在执行,而取消尝试失败,则不会生成异常。cancel方法还会导致command对象删除datareader对象上所有未读的行。

②createparameter:为查询创建一个新参数。

③executenonquery:对连接执行transact-sql语句并返回受影响的行数。对于 update、insert 和 delete 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。

④executereader:将commandtext发送到connection并生成一个sqldatareader。

  public sqldatareader executereader(commandbehavior);



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

⑥executexmlreader:将commandtext发送到connection并生成一个xmlreader。

⑦prepare:在 sql server 的实例上创建命令的一个准备版本。在调用 prepare 之前,应指定要准备的语句中的每个参数的数据类型。

⑧resetcommandtimeout:将commandtimeout属性设置为默认值30秒。

 

ⅲ事件

⒉sqldatareader

ⅰ属性

①depth:获取一个值,该值指示当前行的嵌套深度。最外层表的深度为零。sql server .net framework 数据提供程序不支持嵌套并总是返回零值。

②fieldcount:获取当前行中的列数。如果未放在有效的记录集中,则为 0;否则为当前行中的列数。默认值为 -1。执行不返回行的查询后,fieldcount 返回 0。

③hasrows:如果sqldatareader包含一行或多行,则为true;否则为false。

④isclosed:如果sqldatareader已关闭,则为true;否则为false。

⑤item:获取以本机格式表示的列的值。

⑥recordsaffected:已更改、插入或删除的行数;如果没有任何行受到影响或语句失败,则为 0;-1 表示 select 语句。

ⅱ方法

①close:关闭sqldatareader对象。如果返回值和查询影响的记录的数量不重要,则可以在调用close方法前调用关联的sqlcommand对象的cancel方法,从而减少关闭sqldatareader所需要的时间。

②getname:获取指定列的名称。

③getordinal:在给定列名称的情况下获取列序号。

④getvalue:获取以本机格式表示的指定列的值。

⑤getvalues:获取当前行的集合中的所有属性列。

⑥isdbnull:获取一个值,该值指示列中是否包含不存在的或缺少的值。如果指定的列值与dbnull等效,则为true;否则为false。

⑦nextresult:当读取批处理 transact-sql 语句的结果时,使数据读取器前进到下一个结果。如果存在多个结果集,则为 true;否则为 false。

⑧read:使sqldatareader前进到下一条记录,如果存在多个行,则为true;否则为false。必须调用read来开始访问任何数据。在某一时间,每个关联的sqlconnection只能打开一个sqldatareader,在上一个关闭之前,打开另一个的任何尝试都将失败。

ⅲ事件

⒊sqlparameter

ⅰ属性

①dbtype:获取或设置参数的dbtype。默认值为string。

②direction:获取或设置一个值,该值指示参数是只可输入、只可输出、双向还是存储过程返回值参数。默认值为 input。



③isnullable:获取或设置一个值,该值指示参数是否接受空值。如果接受空值,则为 true;否则为 false。默认为 false。

④parametername:获取或设置 sqlparameter 的名称。

⑤size:获取或设置列中数据的最大大小(以字节为单位)。默认值是从参数值推导出的。

⑥sqldbtype:获取或设置参数的sqldbtype。默认为nvarchar。sqldbtype和dbtype是相互连接的。设置dbtype会将sqldbtype更改为支持的sqldbtype。

⑦value:获取或设置该参数的值。默认为空。

ⅱ方法

ⅲ事件
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表