C# 使用SqlDataReader读取数据库数据

本文主要讲述如何使用SqlDataReader方法来读取数据,来完成数据库增删改查中查的工作,这是C#读取数据库的主要方法。


一、环境介绍

  • Visual Studio 2015
  • SQL Server 2012
  • 控制台应用程序
  • 使用的数据库名称是Itcast2014
  • 使用的表名称是TblPerson
  • 表的字段如下图:


二、代码 

注意事项:

1、代码中读取的方法是较常用的方法,除了该方法,还有其他方法,在最后介绍。

2、SqlDataReader读取数据时只读、只进,即只能读取数据,不能修改数据,并且读取数据时只能一条一条数据向后读取,不能向前读,也不能跳跃读。

3、使用SqlDataReader时必须保证连接是打开状态,使用完后要尽快关闭。

4、SqlDataReader要求独占一个连接。

        /// <summary>
        /// 使用SqlDataReader方式来读取数据
        /// </summary>
        private static void DataReader()
        {
            string conStr = "server=.;database=Itcast2014;integrated security=true;";
            using (SqlConnection con = new SqlConnection(conStr))
            {
                string cmdTxt = "select * from TblPerson";
                using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
                {
                    con.Open();
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        //首先判断是否有数据
                        if (reader.HasRows)
                        {
                            //开始读取数据,读取的方式是一行一行读,每执行一次Read(),读取一行
                            while (reader.Read())
                            {
                                //大部分情况下,是用reader.GetXXXXX()的方法来获取数据,也可以用其他方法
                                //这里的int?和bool?是确保使用?:这种三元表达式时,null的类型和后面的类型可以一致
                                //通过reader.GetXXXXX()方法获得数据时,如果遇到null值,将报错,需要提前判断值是否为null
                                Console.Write((reader.IsDBNull(0) ? null : (int?)reader.GetInt32(0)) + "\t|\t");
                                Console.Write((reader.IsDBNull(1) ? null : reader.GetString(1)) + "\t|\t");
                                Console.Write((reader.IsDBNull(2) ? null : (int?)reader.GetInt32(2)) + "\t|\t");
                                Console.Write((reader.IsDBNull(3) ? null : (int?)reader.GetInt32(3)) + "\t|\t");
                                Console.Write((reader.IsDBNull(4) ? null : (bool?)reader.GetBoolean(4)) + "\t|\t");
                                Console.WriteLine();
                            }
                        }
                    }
                    con.Close();
                }
            }
        }

三、其他方法

(一)第一种方法通过reader的FieldCount属性可以获得读取到的数据有多少列,然后通过遍历每一列,用reader索引器加数字下标的方式,来获得数据。这种方法中reader[i]获得的数据是object类型,可能需要做数据转换。

                                //使用FieldCount字段来遍历读取到的每一列,通过reader索引器下标的方式来获得数据
                                for (int i = 0; i < reader.FieldCount; i++)
                                {
                                    Console.Write(reader[i]+"\t|\t");
                                }
                                Console.WriteLine();

 (二)第二种方法和第一种方法类似,不同的是获取数据的时候使用的是reader的GetValue(i)方法。事实上这两种方法实现的机制是相同的,唯一不同的是reader[]还可以使用列名来获得数据。

                                //使用FieldCount字段来遍历读取到的每一列,通过reader的GetValue(i)的方式来获得数据
                                //GetValue的方法和reader[i]的方法是相同的,唯一不同的是reader还可以通过列名的方式获取数据
                                for (int i = 0; i < reader.FieldCount; i++)
                                {
                                    Console.Write(reader.GetValue(i) + "\t|\t");
                                }
                                Console.WriteLine();

(三)通过索引器加列名的方式获取数据,不过这种方式在内部实现机制上,就是通过一个reader.GetOrdinal(列名)来获得列名对应的id的方式,最后通过索引器加下标获得数据的。

                                //通过reader索引器加列名的方式获得数据
                                Console.Write(reader["autoId"]+"\t|\t");
                                Console.Write(reader["uName"] + "\t|\t");
                                Console.Write(reader["age"] + "\t|\t");
                                Console.Write(reader["height"] + "\t|\t");
                                Console.Write(reader["gender"] + "\t|\t");
                                Console.WriteLine();

注意:

以上三种方法返回的都是object类型,可能需要类型转换,使用时没有上面的第一种强类型的方法方便,一般情况下,我们会使用第一种方法,更严谨方便,还有一点不同的是最后三种方法在遇到null值时,会自动显示为空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值