C# 之SQL DataReader 访问数据

本文介绍如何利用DataReader对象以顺序、只读方式高效读取大量数据,特别适合不需要随机访问和修改数据的情况。文中详细解释了DataReader的常用属性与方法,并通过具体实例展示了其在实际应用中的操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataReader 对象提供了用顺序的,只读的方式读取Command对象获得的数据结果集,正是因为DataReader是以顺序的方式连续的读取数据,所有DataReader会以独占的方式打开数据库的连接

 

由于DataReader只执行读的操作(只读),并且每次只在内存缓冲区里存储结果集中的一条数据,所有使用DataReader的对象的效率比较高,如果要查询大量数据,同时不需要随机访问和修改数据,DataReader是优先的选择

 

DataReader 对象的常用属性

FieldCount 属性 表示记录中有多少字段

HasRows 属性 用来表示DataReader是否包含数据

IsClosed 属性 表示DataReader是否关闭

 

DataReader对象常用方法

Close 方法 将DataReader对象关闭

GetDataTypName 方法 取得指定的字段数据形态(类型)

GetName 方法 取得指定的字段数据名称

GetOrdinal 方法 取得指定字段名称在记录中的顺序

GetValue 方法 取得指定字段的数据

GetValues 方法 取得全部字段的数据

Read 方法 读取下一条记录

实例 : mytable01表中有Id,姓名(name),年龄(age),性别(gender),部门(department),几个字段,并且有几条语句

using System;
using System.Data.SqlClient;

namespace DataReaderDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string constr = "Server = .; user=name;pwd=mima;database=mysql";
            SqlConnection myCon = new SqlConnection(constr);
            try
            {
                myCon.Open();
                string sql = "select * from mytable01 ";
                SqlCommand mycom = new SqlCommand(sql, myCon);
                //声明DataReader
                SqlDataReader mydr;
                mydr = mycom.ExecuteReader();
                if (mydr.HasRows)     
                {
                    Console.WriteLine("mytable01中存在数据");
                }
                else
                {
                    Console.WriteLine("mytable01中不存在任何数据");
                }
                //----------------方法----------------------
                Console.WriteLine("第一列的数据类型"+mydr.GetDataTypeName(0));

                Console.WriteLine("获取对应列的名称:(第一列)"+mydr.GetName(0));

                string mystr = "age";    //直接写会报异常,需要有个转换的过程
                Console.WriteLine(mydr.GetOrdinal(mystr));
                /*  此时将上面的15行的str,换为
                 *   string sql = "select * from mytable01 where id=1";
                if (mydr.Read())
                {
                    Console.WriteLine("取得指定字段的数据:" + mydr.GetValue(0));
                }
                 */

                /*将15行的 str更改为:
                 *  string sql = "select * from mytable01 where gender='男'";
                object[] myobj = new object[mydr.FieldCount];
                while(myde.Read()){
                    mydr.GetValues(myobj);
                    foreach (object item in myobj)
                    {
                        Console.Write(item + "\t");
                        Console.WriteLine();
                    }
                 }  
                */
                //访问DataReader 对象时使用索引要比字段名称快很多
                while (mydr.Read())
                {
                    Console.WriteLine(mydr[0].ToString()+",");
                    Console.WriteLine(mydr[1].ToString() + ",");
                    Console.WriteLine(mydr["gender"].ToString());
                }

                //----------------属性----------------------
                Console.WriteLine("表中有几个字段:"+mydr.FieldCount);

                Console.WriteLine("是否关闭:"+mydr.IsClosed);
                mydr.Close();
                Console.WriteLine("是否关闭:" + mydr.IsClosed);
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                myCon.Close();
            }

            Console.Read();
        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈言必行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值