C#编程基础(下)第六课:ADO.NET数据库开发(二)使用DataReader对象查询数据、Command对象操作数据

知识点:DataReader对象的常用属性和方法、利用Command对象生成DataReader对象、ExecuteReader()方法的使用。

一、使用DataReader对象查询数据

        DataReader是只读只进的读取器,也就是说它只能读取数据而不能修改数据,并且只能从前往后读取,而不能反过来读取数据,每次读取一行数据。

        DataReader的特点是:读取数据比较快,但是需要一直保持数据库连接。

       和Connection对象一样,不同的数据库产品,对应有不同的数据源,因此对应不同的DataReader。SQLServer的命名空间是System.Data.SqlClient 对应的是SqlDataReader类。

命名空间

对应的 DataReader 对象

System.Data.SqlClient 

SqlDataReader

System.Data.OleDb

OleDbDataReader

System.Data.Odbc 

OdbcDataReader

System.Data.OracleClient

OracleDataReader

  

1、为什么使用DataReader?

        使用Command对象的ExecuteScalar方法可以实现单个值的查询(只能返回一行一列的结果),那么遇到要查询数据中多个数据的情况该怎么办呢?比如我要将数据里的关于毛毛的信息(姓名、学校、成绩)都提取出来,这里就要用到DataReader对象了。

2、DataReader对象的主要属性和方法

属性

说明

HasRows 

是否返回了结果

方法

说明

Read

前进到下一行记录

Close

关闭 DataReader 对象

  

3 、使用DataReader对象对数据库进行查询操作步骤

  1.     创建Connection对象
  2.     给Connection对象添加属性
  3.     调用Connection对象Open()方法打开数据库
  4.     创建sql语句字符串
  5.     创建Command对象 SqlCommand cmd = new SqlCommand(sql语句, Connection对象);
  6.     执行命令,获得DataReader对象,语法:SqlDataReader  读取器对象名=命令对象(Command对象名).ExecuteReader();
  7.     使用循环,调用DataReader对象的Read方法,逐行读取数据。(Read方法具有bool类型的返回值。若能读取到数据,则返回true,否则返回false.)
  8.     获取当前数据库表每一行的某一列数据,(可以使用索引或列名来获取当前的某一行数据,索引从0开始,且获取数据时需要进行显式类型转换。) 语法:读取器对象名[索引或列名];
  9.     使用完毕后关闭DataReader对象(数据读取完毕必须关闭DataReader对象,因为在读取数据时,DataReader对象将独占连接,此时,就无法使用当前连接对象执行其他操作。) 语法:读取器对象名.Close();
  10.     关闭数据库连接对象。 语法:连接对象名.Close();

二、DataReader对象使用实例

实例练习:点击按钮,显示数据库表中的信息。

第一步:创建数据库CarSYS,然后创建数据表Brand。数据表Brand有2个字段BrandId,BrandName,使用SQL语句创建数据库、数据库表、并向表中插入一些数据,参见下图。

 

第二步:创建应用程序。在Visual Studio 2017软件中新建项目,并设计程序。

(1)新建一个窗体应用程序

(2)对Form1窗体进行设计。分别添加一个button控件和label控件,并设置label控件的Text属性为空。

下面是一个label控件,label控件的Text属性为空

第三步:编写代码,给button按钮添加点击事件。

(1)、先添加MySQL数据库

(3)、程序中添加MySQL数据库的命名空间using MySql.Data.MySqlClient;

using MySql.Data.MySqlClient;

 (4)、程序代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using MySql.Data.MySqlClient;

namespace WindowsFormsApp6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string constr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
            //1.创建 SQLConnection 的实例
            MySqlConnection connection = new MySqlConnection(constr);//创建一个SqlConnection对象
            try       //将可能出错的语句放在try语句里
            {
                connection.Open();
                //创建查询用的SQL语句
                string sqlstr = "select * from Brand";
                //创建Command对象
                MySqlCommand cmd = new MySqlCommand(sqlstr, connection);
                //执行命令,获得DataReader对象
                MySqlDataReader reader = cmd.ExecuteReader();
                //使用循环,调用DataReader对象的Read方法,逐行读取数据
                while (reader.Read())
                {
                    //获取数据库表行中的某一列数据                    
                    string shuchu = Convert.ToString(reader[0]+"," + reader[1]);
                    //将获取的数据输出,赋值给label对象的Text属性                    
                    label1.Text += shuchu+"\n";
                }
                //关闭DataReader对象                
                reader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);//以消息框形式,输出错误消息
            }
            finally
            {
                if (connection != null)
                {
                    //关闭数据库连接
                    connection.Close();
                    MessageBox.Show("关闭数据库连接成功");
                }
            }
        }
    }
}

(5)、运行效果

 

三、DataReader对象使用实例

实例练习:把数据库表中的信息,填充到窗体控件上

第一步:在Form1窗体中,添加一个ComboBox控件

        ComboBox控件的Items属性没有添加数据,将利用DataReader对象读取数据,然后进行填充。

第二步:双击button1按钮,进入事件,编写代码

     注:添加MySQL数据库步骤参见上面,本例就不在叙述啦!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using MySql.Data.MySqlClient;

namespace WindowsFormsApp7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string constr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
            //1.创建 SQLConnection 的实例
            MySqlConnection connection = new MySqlConnection(constr);//创建一个SqlConnection对象
            try       //将可能出错的语句放在try语句里
            {
                connection.Open();
                //创建查询用的SQL语句
                string sqlstr = "select * from Brand";
                //创建Command对象
                MySqlCommand cmd = new MySqlCommand(sqlstr, connection);
                //执行命令,获得DataReader对象
                MySqlDataReader reader = cmd.ExecuteReader();
                //使用循环,调用DataReader对象的Read方法,逐行读取数据
                while (reader.Read())
                {
                    //获取数据库表行中的某一列数据,并将它添加到comboBox1控件集合里               
                    comboBox1.Items.Add(reader[0]);
                }
                //关闭DataReader对象                
                reader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);//以消息框形式,输出错误消息
            }
            finally
            {
                if (connection != null)
                {
                    //关闭数据库连接
                    connection.Close();
                    MessageBox.Show("关闭数据库连接成功");
                }
            }
        }
    }
}

 

运行效果:

    (1)、当comboBox1.Items.Add(reader[0]);时,运行效果如下

               while (reader.Read())
                {
                    //获取数据库表行中的某一列数据,并将它添加到comboBox1控件集合里               
                    comboBox1.Items.Add(reader[0]);
                }
                //关闭DataReader对象                
                reader.Close();

(2)、当comboBox1.Items.Add(reader[1]);时,运行效果如下

              while (reader.Read())
                {
                    //获取数据库表行中的某一列数据,并将它添加到comboBox1控件集合里               
                    comboBox1.Items.Add(reader[1]);
                }
                //关闭DataReader对象                
                reader.Close();

思考:这样情况下,我们重复的写了大量的重复代码,有什么办法可以让我们的代码编写工作量小一些?

————————————————
版权声明:本文为CSDN博主「逍遥小丸子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dnruanjian/article/details/90674685

 

 

 

https://blog.csdn.net/dnruanjian/article/details/90674685?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.nonecase

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值