码迷,mamicode.com
首页 > 其他好文 > 详细

DataReader用法

时间:2015-11-20 09:13:26      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

一、DataReader含义

DataReader相比于DataSet,DataReader是一个抽象类,所以不能用DataReader DR = new DataReader(),来构造函数创建对象,如果要创建一个DataReader对象,必须通过command对象的ExecuteReader方法。

DataReader对象访问数据的方式,只能顺序读取数据,而且不能写入数据(这点DataSet占据绝对的优势),所谓的顺序读取数据是将数据表中的行从头至尾一次读出。DataReader被创建时,纪录指针在表的最前端,可以使用Read方法每次从表中读取一条纪录。

DataSet存的是二维数组,而DataReader存的是一维数组。而且DataSet采用的是非连接的传输模式访问数据源,一旦用户所请求的数据读入DataSet,与数据库的连接就关闭,而DataReader则要时刻保持与数据库连接状态。

 

二、重要属性

FieldCount: 只读,表示纪录中有多少字段
HasMoreResults: 表示是否有多个结果,本属性和SQL Script 搭配使用。
HasMoreRows: 只读,表示是否还有资料未读取
IsClosed: 只读,表示DataReader 是否关闭
Item: 只读,本对象是集合对象,以键值(Key)或索引值(Index)的方式取得纪录中某个字段的数据
RowFetchCount: 用来设定一次取回多少笔记录,预设值为1 笔

 

三、常用方法

Close():关闭DataReader对象

GetValue(col):获取序号为col的列的值

GetValues(values)

获取所有字段的值,并将字段值存放到values数组中。

GetValues(values)方法原来我不会用,特别是对于这个values数组是哪里来的,以及如果自定义该定义为什么类型呢,后来百度就知道了,用这个方法之前,Object[] values = new Object[sqlrd.FieldCount];这个是定义values数组的方法前提。

Read()

读取下一条纪录,返回布尔型,返回true,则表示有下一条纪录。一般这个方法与while()循环一起用。是DataReader对象最重要的一个方法。

GetDataTypeName(col) :获取序号为col的列的来源数据类型名

GetFieldType(col) :获取序号为col的列的数据类型,一般显示会是System.**

GetName(col): 获取序号为col的列的字段名

GetOrdinal(name) :获取字段名为name的列的序号

 

三、DataReader实例

 

 
C# 代码   复制
技术分享技术分享
        protected void Page_Load(object sender, EventArgs e)
技术分享技术分享
        {
技术分享
技术分享            string con = ConfigurationManager.ConnectionStrings["con"].ToString();
技术分享
技术分享            SqlConnection sqlcon = new SqlConnection(con);
技术分享
技术分享            string sql = "select * from Cloths";
技术分享
技术分享            sqlcon.Open();
技术分享
技术分享            SqlCommand sqlcom = new SqlCommand(sql, sqlcon);
技术分享
技术分享            SqlDataReader sqlrd;
技术分享
技术分享            sqlrd = sqlcom.ExecuteReader();
技术分享
技术分享            Response.Write("获取DataReader对象包含的记录行数,注意这里DataReader的结构跟数据库的结构是不一样的,它把数据库的一行转换成了一列:" + sqlrd.FieldCount);
技术分享
技术分享            Response.Write("<br>");
技术分享
技术分享            Response.Write("获取序号为0的列的来源数据类型名:" + sqlrd.GetDataTypeName(0));
技术分享
技术分享            Response.Write("<br>");
技术分享
技术分享            Response.Write("获取序号为0的列的数据类型:" + sqlrd.GetFieldType(0));
技术分享
技术分享            Response.Write("<br>");
技术分享
技术分享            Response.Write("获取序列号为0的列的字段名:"+sqlrd.GetName(0));
技术分享
技术分享            Response.Write("<br>");
技术分享
技术分享            Response.Write("获取字段名为品牌的列的序号:"+sqlrd.GetOrdinal("品牌"));
技术分享
技术分享            Response.Write("<br>");
技术分享
技术分享            while (sqlrd.Read())
技术分享
技术分享            {
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                Response.Write(sqlrd["id"] + "," + sqlrd["品牌"] + "," + sqlrd["价格"] + "," + sqlrd["数量"]);
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                Response.Write("下面的显示要注意,为什么序列号为0的是品牌而不是id,虽然GridViewCommon页面第一列是id,不过这里是要充分尊重数据库的结构,可以看出数据库中第一列是品牌!");
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                Response.Write("这里通过GetString函数取出序号为0的列的数据,这里要根据数据的不同类型选用不同的Get函数,可能是GetChar(),GetInt32()等等:"+sqlrd.GetString(0));//这里可以看出GetValue函数可以不需要事先知道每一列的数据类型就可以取出数据,所以尽量用GetValue函数
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                Response.Write("这里通过GetValue函数取出序号为0的列的数据,不需要管数据时什么类型,这里注意跟上面的比较:" + sqlrd.GetValue(0));
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                Response.Write("这里是运用GetValue()的方法提取显示数据的:");
技术分享
技术分享                for (int i = 0; i < sqlrd.FieldCount;i++ )//这里通过循环取出数据,其实就是循环使用GetValue()方法
技术分享
技术分享                {
技术分享
技术分享                    Response.Write(sqlrd.GetValue(i));//这个是一步一步取数据,用的是GetValue()方法,相比于GetValues,GetValues是一步到位,只要循环数组就好
技术分享
技术分享                    Response.Write("<br>");
技术分享
技术分享                }
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                Response.Write("这里是运用GetVales()方法提取显示数据的:");
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                Object[] values = new Object[sqlrd.FieldCount];//这一步是很重要的,你要先给定义一个数组
技术分享
技术分享                sqlrd.GetValues(values);//注意这边是用的是GetValues(values)方法
技术分享
技术分享                Response.Write(values[0]+","+values[1]+","+values[2]+","+values[3]+","+values[4]);
技术分享
技术分享                Response.Write("<br>");
技术分享
技术分享                for (int i = 0; i < sqlrd.FieldCount;i++ )//这里是循环的values数组,而不是GetValues(values)方法
技术分享
技术分享                {
技术分享
技术分享                    Response.Write("<br>");
技术分享
技术分享                    Response.Write(values[i]);
技术分享
技术分享                    Response.Write("<br>");
技术分享
技术分享                }
技术分享
技术分享 
技术分享
技术分享            }
技术分享
技术分享            sqlrd.Close();
技术分享
技术分享            Response.Write("<br>");
技术分享
技术分享            Response.Write(sqlrd.RecordsAffected);//获取执行SQL语句所更改,插入或删除的行数
技术分享
技术分享            sqlcon.Close();
技术分享
技术分享        }
技术分享

 

实例2:

 
C# 代码   复制
技术分享技术分享
using System;
技术分享
using System.Data;
技术分享
using System.Data.SqlClient;
技术分享
using System.Data.OleDb; 
技术分享技术分享
class SqlReader
技术分享
{
技术分享 const string connStr = "data source=table;user id=sa;password=dddd;initial catalog=contract";
技术分享 SqlConnection conn; 
技术分享
技术分享
技术分享 public SqlReader()
技术分享 {
技术分享  conn = new SqlConnection(connStr);
技术分享 }
技术分享 
技术分享 //**************************************
技术分享 //*演示DataReader的两种取值方法
技术分享 //**************************************
技术分享 public void basicReader()
技术分享 {
技术分享  string sql="select * from friend";
技术分享  SqlCommand cmd; 
技术分享  cmd = conn.CreateCommand();
技术分享  cmd.CommandText = sql;
技术分享  conn.Open();
技术分享  SqlDataReader reader = cmd.ExecuteReader();
技术分享  while(reader.Read())
技术分享  {
技术分享   Console.WriteLine("No:{0}\\tName:{1}\\tPhoneNum:{2},\\tAddress:{3}",reader.GetInt32(0).ToString(),reader.GetString(1),reader[2].ToString(),reader["Faddress"].ToString());
技术分享  }
技术分享  showSplit();
技术分享  reader.Close();
技术分享  conn.Close();
技术分享 }
技术分享 
技术分享 //**************************************
技术分享 //*演示带参数查询的操作,使用SqlCilent
技术分享 //**************************************
技术分享 public void hasParamReader()
技术分享 {
技术分享  SqlCommand cmd; 
技术分享  cmd = conn.CreateCommand();
技术分享  string sql = "select Fname,Fphone,Faddress from friend where Fid > @Fid";
技术分享  cmd.CommandText = sql;
技术分享  SqlParameter param = new SqlParameter("@Fid",SqlDbType.Int,4);
技术分享  param.Value = 15;
技术分享  cmd.Parameters.Add(param);
技术分享  conn.Open();
技术分享  //当关闭reader的时候同时关闭数据库连接
技术分享  SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
技术分享  while(reader.Read())
技术分享  {
技术分享   Console.WriteLine("Name:{0}\\tPhoneNum:{1}\\tAddress:{2}",reader.GetString(0),reader.GetString(1),reader.GetString(2));
技术分享  }
技术分享  showSplit();
技术分享  //无需关闭conn,系统会自动调用这个方法来关闭conn的。
技术分享  reader.Close(); 
技术分享 }
技术分享 
技术分享 //**************************************
技术分享 //*演示存储过程的输出参数
技术分享 //**************************************
技术分享 public void outParamShow()
技术分享 {
技术分享  SqlCommand cmd; 
技术分享  cmd = conn.CreateCommand();
技术分享  cmd.CommandText = "GetInfo";
技术分享  cmd.CommandType = CommandType.StoredProcedure;
技术分享  SqlParameter param = cmd.Parameters.Add("@Fid",16);
技术分享  param = cmd.Parameters.Add("@Fname",SqlDbType.VarChar,8);
技术分享  param.Direction = ParameterDirection.Output;
技术分享  param = cmd.Parameters.Add("@Fphone",SqlDbType.VarChar,8);
技术分享  param.Direction = ParameterDirection.Output;
技术分享  conn.Open();
技术分享  cmd.ExecuteNonQuery();
技术分享  string Fname = cmd.Parameters["@Fname"].Value.ToString();
技术分享  string Fphone = cmd.Parameters["@Fphone"].Value.ToString();
技术分享  Console.WriteLine(Fname + "  " + Fphone);
技术分享  conn.Close();
技术分享  showSplit();
技术分享 }
技术分享 
技术分享 //**************************************
技术分享 //*演示读取多个无关记录集
技术分享 //************************************** 
技术分享 public void multiResult()
技术分享 {
技术分享  SqlCommand cmd; 
技术分享  cmd = conn.CreateCommand();
技术分享  string sqla = "select Fname from friend";
技术分享  string sqlb = "select Fphone from friend";
技术分享  cmd.CommandText = sqla + ";" + sqlb;
技术分享  conn.Open();
技术分享  SqlDataReader reader= cmd.ExecuteReader();
技术分享  int i = 1;
技术分享  do
技术分享  {
技术分享   Console.WriteLine("第" + i.ToString() + "个记录集内容如下:\\n");
技术分享   while(reader.Read())
技术分享   {
技术分享    Console.WriteLine(reader[0].ToString() + "\\t");
技术分享   }
技术分享   i++;
技术分享  }while(reader.NextResult()); //NextResult()移动到下一个记录集
技术分享  reader.Close();
技术分享  conn.Close();
技术分享  showSplit();
技术分享 }
技术分享 
技术分享 //**************************************
技术分享 //*使用DataReader获得数据库模式信息
技术分享 //************************************** 
技术分享 public void getSchema()
技术分享 {
技术分享  SqlCommand cmd; 
技术分享  cmd = conn.CreateCommand();
技术分享  string sql = "select Fid,Fname,Fphone from friend";
技术分享     cmd.CommandText = sql;
技术分享     conn.Open();
技术分享     SqlDataReader reader = cmd.ExecuteReader();
技术分享     DataTable SchemaTable = reader.GetSchemaTable();
技术分享     
技术分享     DataRowCollection SchemaColumns = SchemaTable.Rows;
技术分享     DataColumnCollection SchemaProps = SchemaTable.Columns;   
技术分享     foreach(DataRow SchemaColumn in SchemaColumns)
技术分享     {
技术分享      foreach(DataColumn SchemaColumnProp in SchemaProps)
技术分享      {
技术分享       Console.WriteLine(SchemaColumnProp.ColumnName + "=" + SchemaColumn[SchemaColumnProp.ColumnName].ToString());
技术分享      }
技术分享     }
技术分享     reader.Close();
技术分享     conn.Close();
技术分享     showSplit();
技术分享 }
技术分享 
技术分享 //**************************************
技术分享 //*从数据库读取二进制数据的代码段
技术分享 //*该代码段只是读取二进制的片断,不是
技术分享 //*整个程序,所以不能执行,你可以把它
技术分享 //*集成到你的WinForm项目里面。
技术分享 //************************************** 
技术分享 public void getBinary()
技术分享 {
技术分享  /*
技术分享  System.IO.MemoryStream stream = new System.IO.MemoryStream();
技术分享  System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);   
技术分享  int BufferSize = 1024;
技术分享  byte[] Buffer = new Byte[BufferSize];
技术分享  long Offset = 0;
技术分享  long BytesRead = 0;
技术分享  do
技术分享  {
技术分享   BytesRead = reader.GetBytes(2,Offset,Buffer,0,BufferSize);
技术分享   writer.Writer(Buffer,0,(int)BytesRead);
技术分享   writer.Flush();
技术分享   Offset += BytesRead;
技术分享  }
技术分享  while(BytesRead == BufferSize);
技术分享  */
技术分享 }
技术分享 
技术分享 //添加输出分隔
技术分享 private void showSplit()
技术分享 {
技术分享  Console.WriteLine("\\n********************************************************************\\n");
技术分享 }
技术分享 
技术分享 public static void Main(string [] args)
技术分享 {
技术分享  SqlReader sqlreader = new SqlReader();
技术分享  
技术分享  sqlreader.basicReader();
技术分享  
技术分享  sqlreader.hasParamReader();
技术分享  
技术分享  sqlreader.hasOledbParamReader();
技术分享  
技术分享  sqlreader.outParamShow();
技术分享  
技术分享  sqlreader.multiResult();
技术分享  
技术分享  sqlreader.getSchema();
技术分享 } 
技术分享} 

DataReader用法

标签:

原文地址:http://www.cnblogs.com/xdot/p/4979689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!