A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 许庭洲 黑马帝   /  2012-7-3 17:07  /  3178 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请求各位谈谈对Connection ,Command  ,DataAdapter ,DataSet和DataReader的理解。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

10 个回复

倒序浏览
一:ado.net对象
ado.net的对象有:
   Connection(连接对象):负责与数据库创建连接;
   Command(命令对象):负责执行各种sql命令,达到对数据库的增删改查操作;
   DataReader(一种简单的数据表对象):通常是由命令对象执行查询操作得到的此对象;
   DataSet(数据集):通常我们要数据的时候是直接到数据库中取东西,而DataSet是一次性把数据库中的数据取出存到计算机内存中;
   DataAdapter(数据适配器):同DataSet一起使用,简单的理解就是把它当做一个搬运工,当DataSet对象改变时可以用适配器DataAdapter对数据库进行一次性更新;
   DataTable(临时性虚拟表):和DataGridview、combobox绑定很方便;

待续.....................

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
二:ado.net的操作流程:
   简单的说,就是应用程序对数据库进行增删改查操作;
   第一步:创建Connection对象;(只要连数据库就要他,铁板钉钉的一步);
   分支一:
        第二步:创建Command对象;
           根据需求执行
                  增、删、改操作:调用ExcuteNonQuery()方法,返回受影响的行数;
                 查 操作1:调用ExcuteScalar()方法, 得到的是查询结果的首行首列对象(object类型);
                 查 操作2:调用ExcuteReader()方法,得到的是一张查询表SqlDataReader对象
   分支二:
        第二步:创建DataAdapter对象;
           可以用他的Fill()方法填充指定的DataTable、或DataSet
           通过它的Update()方法更新DataSet对应的数据库信息

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
三、附赠一个很有用的类DBHelper类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace TestDBHelper
{
    class DBHelper
    {
        /// <summary>
        /// 连接数据库的地址
        /// </summary>
        private const string CONNECTIONSTR = "";

        /// <summary>
        /// 获得连接
        /// </summary>
        /// <returns></returns>
        public static SqlConnection GetConnection()
        {
            return new SqlConnection(CONNECTIONSTR);
        }
        /// <summary>
        /// 执行增删改操作
        /// </summary>
        /// <param name="sql">执行的sql语句</param>
        /// <returns>返回受影响的行数</returns>
        public static int ExecuteNonQuery(string sql)
        {
            SqlConnection con = GetConnection();
            SqlCommand cmd = new SqlCommand(sql, con);
            con.Open();
            int ret = cmd.ExecuteNonQuery();
            con.Close();
            return ret;
        }
        /// <summary>
        /// 执行查询操作
        /// </summary>
        /// <param name="sql">执行的sql语句</param>
        /// <returns>返回查询结果的首行首列对象</returns>
        public static Object ExecuteScalar(string sql)
        {
            SqlConnection con = GetConnection();
            SqlCommand cmd = new SqlCommand(sql, con);
            con.Open();
            Object obj = cmd.ExecuteScalar();
            con.Close();
            return obj;
        }
        /// <summary>
        /// 执行查询操作
        /// </summary>
        /// <param name="sql">执行的sql语句</param>
        /// <returns>返回一张查询表SqlDataReader对象</returns>
        public static SqlDataReader ExecuteReader(String sql)
        {
            SqlConnection con = GetConnection();
            SqlCommand cmd = new SqlCommand(sql, con);
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return reader;
        }
        /// <summary>
        /// 获得临时数据表的方法
        /// </summary>
        /// <param name="sql">执行的sql语句</param>
        /// <returns>返回一张创建的临时表</returns>
        public static DataTable GetDataTable(string sql)
        {
            SqlConnection con = GetConnection();
            SqlDataAdapter adapter = new SqlDataAdapter(sql, con);
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            return dt;
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
希望以上的对你有所帮助!
回复 使用道具 举报
刚刚又找了下相关的图,有助于理解

ado.net关系图.jpg (32 KB, 下载次数: 49)

ado.net关系图

ado.net关系图
回复 使用道具 举报
肖琦 发表于 2012-7-3 19:04
一:ado.net对象
ado.net的对象有:
   Connection(连接对象):负责与数据库创建连接;

谢谢您的指点!
回复 使用道具 举报
connection: 负责建立sql连接用
command:执行数据库操作的sql语句
datareader:在线读取数据,读一条,取一条
adapter:用于dataset获取离线数据集用的,一般与dataset合用
dataset:离线数据集,可进行离线增删改查,并支持写回数据库

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
Connection:主要是开启程序和数据库之间的连接。没有利用连接对象将数据库打开,是无法从数据库中取得数据的。
Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连接到数据源。
DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。
DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来,DataSet是放在内存中的。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow。
DataReader:当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的,只能(通过游标)读取当前行的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。 ADO.NET 使用Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
Connection ,Command  ,DataAdapter ,DataSet和DataReader
一、Connection
Connection对象就是用来建立数据库的连接。在与数据库连接的时候,需要向数据库提供一些必要信息,这些信息构成Connection对象的属性,也是该对象实例化时的参数,如数据库地址、数据库名称、用户名、密码等相关信息。

二、Command
Command对象就是用来执行数据库操作命令的。比如对数据库中数据表的添加删除,记录的增加删除,或是记录的更新等等都是要通过Command对象 来实现的。一个数据库操作命令可以用SQL语句来表达,包括选择查询(SELECT语句)来返回记录集合,执行更新查询(UPDATE语句)来执行更新记 录,执行删除查询(DELETE语句)来删除记录等等。Command命令也可以传递参数并返回值,同时Command命令也可以被明确的地定界,或调用 数据库中的存储过程。

三、DataReader
DataReader 对象从数据库中检索只读、只进的数据流。查询结果在查询执行时返回,在并存储在客户端的网络缓冲区中,直到使用 DataReader 的 Read 方法对它们发出请求。使用 DataReader 可以提高应用程序的性能,因为一旦数据可用,DataReader 方法就立即检索该数据,而不是等待返回查询的全部结果;并且在默认情况下,该方法一次只在内存中存储一行,从而降低了系统开销。因此,在普通的Web程序 里,DataReader对象是个比较招人喜欢的对象。当用户的对数据的需求为下列三种情况的时候,推荐使用DataReader对象:
(1)、数据必须是新的――这个要求必须是即时读取数据库记录,而DataReader对象的实例化不会消耗很多内存;
(2)、数据需求简单―一般使用手写代码,或是绑定到简单的数据控件上,执行命令为手写的SQL语句或是存储过程,在这种情况下DataReader将提供有效的访问数据方法;
(3)、数据操作倾向于向前的只读的操作――没有往返的交互操作。

四、DataSet
   DataSet对象是ADO.NET的核心,基于DataSet的数据模型才使得ADO.NET实现离线式数据操作模型。DataSet是存在于内存中 的数据库,是专门用来处理数据保存体中读出的数据。它的优点就是离线式的,一点读取到数据源中的数据后,就在内存中建立数据库的副本,在此之后的操作,直 到执行更新命令为止,所有的操作都是在内存中完成的。不管底层的数据库是哪种形式,DataSet的行为都是一致。
五、DataAdapter
   DataAdapter对象可以隐藏和Connection、Command对象沟通的细节,通过DataAdapter对象建立、初始化 DataTable,从而和DataSet对象结合起来在内存存放数据表副本,实现离线式数据库操作,事实上在8.1.2节中,我们在介绍DataSet 数据模型的时候就已经演示了如何利用DataAdapter对象进行数据库连接。DataAdapter对象允许将DataSet对象中的数据保存到数据 源中,也可以从数据源中读取数据,并且也可以底层数据保存体进行数据的添加、删除、更新等操作。
DataAdapter对象含有四个不同的操作命令,分别如下:
(1)、SelectCommand:用来或去数据源中的记录;
(2)、InsertCommand:用来向数据源中新插入一条记录;
(3)、UpdateCommand:用来更新数据源中的数据;
(4)、DeleteCommand:用来删除数剧源中的记录。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
在ado.net 的五大对象就像我们农村在家里浇地一样,要完成这项工作必须完成的几大步骤:
用什么东西浇(connection就像抽水的管道)
用什么方法浇(command或dataAdapter(就像抽水机))
往哪个地方浇(DataSet就像多块地包括各家的田地(datatable))

DataReader只能从数据库里面逐个向前读不能往后退,就像出栈指针只能从栈顶一个一个指到栈低
DataReader不好比喻只能这样说浅一点
如有不明白还可以继续讨论

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马