SqlDataReader的用法(重点:访问字段的值)

来源:互联网 发布:大数据 智能交通 编辑:程序博客网 时间:2024/05/01 10:26

在基于链接的数据库访问模式下,查询类操作通常是执行select命令,产生的查询结果可以通过SqlDataReader类依次读取。
SqlDataReader类是ADO.NET提供的用于读取SQL Server数据库记录的只读向前数据记录读取器。
开始时,SqlDataReader指向第一条记录之前,不能直接,通过SqlDataReader,Read()方法可以读取下一条记录,重复指令,直到全部记录读取完成
为了方便获取数据记录中的某个字段的值,SqlDataReader类还提供GetXXX()一系列的方法,将指定字段的数据按照特定数据类型读取,如int、string、DataTime等等

通常我们使用Command类的ExecuteRader方法来创建DataReader对象:
 SqlCommand cmd = new SqlCommand(commandText,ConnectionObject) 
SqlDataReader dr = cmd.ExecuteReader(); 
DataReader类最常见的用法就是检索Sql查询或者存储过程返回的记录。

 

**********************************************************************************************************************************************************************************

SqlDataReader类常用成员

一、属性

     1、Depth:表示当前行的嵌套属性(我不常用)

     2、FieldCount:表示当前行中的列数

     3、HasRows:表示当前行SqlDataReader是否包含一行或多行(常用,用于登录检测用户是否存在)

     4、IsClose:表示SqlDataReader实例是否已经关闭了

     5、VisibleFieldCount:表示当前SqlDataReader中未隐藏的字段的数目。

二、方法

     Read():使得当前SqlDataReader前进道下一条记录,即向前读取。(常用)

     我们经常这样做: While(dr.Reader()) //遍历所有记录

                                     { //do something with the current record }

 注意,如果每一条记录的操作可能花费比较长的时间,那么意味着阅读器将长时间打开,那么数据库连接也将维持长时间的打开状态。

此时使用非连接的DataSet或许更好一些。

    NextResult() :使得数据读取器前进道下一个结果,注意,不是一行记录

    IsDBNull():确定指定列中是否包含不存在或缺少的值。

    Close():关闭当前SqlDataReader实例。

GetXXXXX()的用法索引从0开始→//转载yanjun_xiaoli博客:

 访问字段的值 有2种方法。

第一种是Item属性,此属性返回字段索引或者字段名字对应的字段的值。

第二种是Get方法,此方法返回有字段索引指定的字段的值。看例子。

(1) Item属性 每个DataReader类都定义一个Item属性。比如现在我们有一个DataReader实例dr,对应的sql语句是select Fid,Fname from friend,则我们可以使用下面的方法取得返回的值:

 object ID = dr[“Fid”]; object Name = dr[“Fname”]; 
或者: object ID = dr[0]; object Name = dr[1]; 注意索引总是从0开始的
但是,使用object来定义ID和Name,Item属性返回的值是object型,我们需要强制类型转换。例如:
 int ID = (int)dr[“Fid”]; string Name = (string)dr[“Fname”]; 【!】确保类型转换的有效性是开发者的责任,否则将会得到异常。 
 
【方法】
 
SqlDataReader myReader=myCmd.ExecuteReader();
myReader.Read();
Label1.Text=myReader["字段1"];
Label1.Text=myReader["字段2"];
******
 
(2)Get方法 每个DataReader都定义了一组Get方法。同上面的例子一样我们用如下方式访问Fid和Fname的值: 
int ID = dr.GetInt32(0); 
string Name = dr.GetString(1); 
值得注意的是:
a、这些方法把数据从数据源类型转化为.net数据类型,但是他们不执行其他的数据转换,比如他们不会把16位整数转换为32位的。
b、Get方法不能使用字段名来访问字段,也就是说上面的没有: int ID = dr.GetInt32(“Fid”); //错误 string Name = dr.GetString(“Fname”); 
      但是,当字段很多的时候,或者过了一段时间以后再来看这些代码,会觉得很难以理解!一个可行的解决办法是
【方法1】
const: const int FidIndex = 0;
const int NameIndex = 1; 
int ID = dr.GetInt32(FidIndex); 
string Name = dr.GetString(NameIndex); 
这个办法并不怎么好,另外一个好一些的办法:
【方法2】
 int NameIndex = dr.GetOrdinal(“Fname”); //取得Fname对应的索引值
 string Name = dr.GetString(NameIndex); 
这样似乎有点麻烦,但是当须要遍历阅读器种大量的结果集的时候,这个方法很有效,因为索引只需执行一次。
 int FidIndex = dr.GetOrdinal(“Fid”); 
int NameIndex = dr.GetOrdinal(“Fname”); 
while(dr.Read()) 
{
 int ID = dr.GetInt32(FidIndex);
 string Name = dr.GetInt32(NameIndex); 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 【实例取值】
string strSql = "Data Source=VQJREZV7DVSK2QA;Initial Catalog=gridviewAPP;User ID=sa;Password=admin@123456";
            SqlConnection connew = new SqlConnection(strSql);
            SqlCommand cmd = connew.CreateCommand();
            connew.Open();
            cmd.CommandText = "select userName,sex,address from userInfo";
            SqlDataReader dr = cmd.ExecuteReader();
            System.Console.WriteLine("查询的结果如下:");
            while (dr.Read())
            {
                //string username,string sex,string address
                Label1.Text= dr.GetString(0);
                Label2.Text= dr.GetString(1);
                Label3.Text= dr.GetString(2);
            }
            connew.Close();

******************************************************************************************************************

                                    无奈而华丽丽的分割线【DataReader的创建方法】

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 【1】遍历DataReader结果集

            //SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

            //SqlDataReader dr = cmd.ExecuteReader();           
            //while (dr.Read())
            //{
            //    Response.Write(dr.GetInt32(0).ToString()+ ", " + dr.GetString(1) + "<br>");
            //}
            //dr.Close();

【2】使用列名索引器

            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                Response.Write(dr["ProductId"].ToString()+ ", " + dr["Name"].ToString() + "<br>");
            }
            dr.Close();
            myConnection.Close();

【3】使用序数索引器 

           SqlDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
             {
                    Response.Write(dr[0].ToString()+ ", " + dr[1].ToString()+ "<br>");
             }
【4】操作多个数据集

            //SqlDataReader dr = cmd.ExecuteReader();
            dr.NextResult();     //使数据读取器前进到下一个结果集
            do
            {
                while (dr.Read())
                {
                    Response.Write(dr.GetInt32(0).ToString() + ", " + dr.GetString(1) + "<br>");
                }
            }
            while(dr.NextResult());
            dr.Close();

 

******************************************************************************************************************

                                    无奈而华丽丽的分割线【DataReader注意事项】

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

使用DataReader的一些注意事项:

(1)使用带参数的Command前,必须关闭DataReader;

(2)完成读数据之后一定要关闭DataReader;

(3)不能在层之间远程访问DataReader,它只为已经连接好的数据访问而设计;

(4)一个单一连接每次只能打开一个DataReader;

(5)在默认情况下,DataReader每次执行Read()时候都要将整行加载到内存中

(6)注意,当访问数据时候,使用类型访问器,如GetString等等,这使得你不用将GetValue返回的Object强制转换成特定类型》【切记】

       类型访问器有:GetChar(int i);GetDataTime(int i);GetInt16(int i);GetString(int i)之类的。

            dr.GetDataTypeName(int i) //获取源数据类型的名称
            dr.GetFieldType((int i) //获取对象的数据类型的Type
            dr.GetName(int i) //获取指定列的名称
            dr.GetOrdinal(int i) //在给定列名称的情况下获取列序号

 

 

原创粉丝点击