前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈ADO.NET中的对象——Connection、Command、DataReader、DataAdapter、DataSet、DataTable

浅谈ADO.NET中的对象——Connection、Command、DataReader、DataAdapter、DataSet、DataTable

作者头像
DannyHoo
发布2018-09-13 11:32:32
1.1K0
发布2018-09-13 11:32:32
举报
文章被收录于专栏:Danny的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1336908

    可能是当初没有好好总结的缘故,学习.NET以来,对ADO.NET中的对象一直有些模糊,今天重新回顾了一下,通过查资料,总结,结合自己的观点整理一下ADO.NET中Connection、Command、DataReader、DataAdapter、

DataSet、DataTable这几个对象的相关知识,希望对初学者能起到一个全局把控的作用,希望大牛能留下宝贵的指导意见。

    不谋万世者,不足以谋一时;不谋全局者,不足以谋一域。从网上找了一张图片,先来看一下这几个对象大体上的关系:

    以下的例子仅以连接 SQL Server数据库为例,所以分别以SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter、DataSet、DataTable为例进行说明。

ADO.NET对象

SqlConnection(http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection(v=vs.110%29.aspx)

    我们打电话时,通常有三个步骤:拨号→通话→挂机。

    与数据库打交道的过程也是如此。通常我们访问数据库,首先都必须要通过SqlConnection与数据库建立连接,然后对数据库进行操作,最后关闭与数据库的连接。

下面是一个完整的SqlConnection的生命周期:

代码语言:javascript
复制
<span style="font-family:SimSun;">    string strConn = "server=192.168.24.123;database=DataBaseName;uid=sa;pwd=123456";  //定义数据库连接字符串
    SqlConnection conn = new SqlConnection(strConn);                                   //实例化Sqlconnection对象
    //具体操作
    //……
    //……
    //具体操作
    conn.Close();                                                                      //操作完毕,连接关闭</span>
 【SqlCommand(http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand(v=vs.110%29.aspx)】

    从字面上来看就会理解SqlCommand就是一个命令,当与数据库建立连接之后,就可以用SqlCommand来对数据库进行增删改查、执行存储过程等。

    我们可以通过三种方法来创建SqlCommand对象:

    1、直接创建,再分别对属性赋值:

代码语言:javascript
复制
<span style="font-family:SimSun;">    string strConn,cmdText;
    strConn="server=192.168.24.123;database=DataBaseName;uid=sa;pwd=123456";
    cmdText="select * from TableName"; 
    SqlCommand cmd=new SqlCommand();
    cmd.Connection=strConn;
    cmd.cmdText="select * from TableName";</span>

    2、利用SqlCommand的构造函数进行创建:

代码语言:javascript
复制
<span style="font-family:SimSun;">    string strConn,cmdText;
    strConn="server=192.168.24.123;database=DataBaseName;uid=sa;pwd=123456";
    cmdText="select * from TableName"; 
    SqlCommand cmd=new SqlCommand(strConn,cmdText);</span>

    3、通过SqlConnection对象的CreateCommand()方法创建:

代码语言:javascript
复制
<span style="font-family:SimSun;">    strConn,cmdText;
    strConn="server=192.168.24.123;database=DataBaseName;uid=sa;pwd=123456";
    SqlConnection conn=new SqlConnection(strConn);
    SqlCommand cmd=conn.CreateCommand();
    cmd.cmdText="select * from TableName"; </span>

SqlCommand常用的属性有:

◆ CommandText:需要执行的SQL语句、表名或存储过程。

◆ CommandType:需要执行的CommandText的类型,默认值是“Text”,表示执行的是SQL语句;值“StoredProcedure表示执行的是存储过程”。

◆ Parameters:CommandText中的参数,可以通过cmd.Parameters.Add()或cmd.Parameters.AddRange()方法添加参数。

SqlCommand常用的方法有:

     ◆ ExecuteNonQuery():返回值为整形,表示对数据库进行增删改后,数据库所影响的行数,也可以直接执行。

◆ ExecuteReader():返回值为SqlDataReader类型,用于对数据库的查询,下文对SqlDataReader的描述中会说明。 

◆ ExecuteScalar():返回值为object类型,用于查询数据库中的单个值,比如查找到的姓名为“张三”,那么查询后就可以转化成字符型;查找到的张三的年龄为21,那么查询后就可以转化成整型。

    更多关于SqlCommand的细节可以参考MSDN:SqlCommand 类

SqlDataReader

SqlDataReader主要与SqlCommand结合使用用来快速读取,并且这种读取只能“向前”读取数据。

    比如查询到上面四条数据,SqlDataReader只能按照姓名分别为“张三”→“李四”→“王五”→“赵六”向下依次读取元组。SqlDataReader的Read()方法返回值为布尔类型,向下读取时如果下一条存在数据,则返回True,如果不存在数据,则返回False,类似于VB中的EOF和BOF

创建:SqlDataReader只能由SqlCommand对象的ExecuteReader()方法创建。

    SqlDataReader可以逐条读取数据,也可以直接作为数据源赋值给某些控件的DateSource属性。

   需要注意的是:一个SqlConnection连接下只允许打开一个SqlDataReader,此时这个SqlConnection对象只为这一个SqlDataReader服务,如果还想再打开一个SqlDataReader,则必须先讲前面那个关闭(当然也可以再创建一个SqlConnection对象,了解一下多线程就会明白)。就如同一个人一张嘴不可能同时吃两碗饭一样,你得先停止吃第一个碗里的饭才能去吃第二碗饭。

   【SqlDataAdapter

    对数据库的操作可以分为两张方式,一种是基于连接的,一种是离线的。如下图:

    SqlDataAdapter通常和DataSet一起使用,上图中,左边的部分在SqlCommand和SqlDataReader进行操作的同时,SqlConnection都保持在打开的状态;右边部分的工作流程为:SqlConnection先打开与数据库的连接,SqlDataAdapter再将从数据库中查询到的数据提取出来保存(通过)到DataSet中(通过SqlDataAdapter的Fill()方法),同时SqlDataAdapter与DataSet的连接关闭,当DataSet中的数据更新时,SqlDataAdapter再将DataSet中更新后的数据 “搬运” 到数据库中并更新(通过SqlDataAdapter的Update()方法)。

    DataAdapter就像一个搬运工一样,查询数据的时候,它在数据库中查询并将查询结果搬给DataSet,当用户对DataSet中的数据执行了增、删、改操作(即DataSet中的数据发生变化)的时候,DataAdapter再将更新后的数据搬回给数据库(即对数据库进行更新)。

    我们可以通过三种方法来创建DataAdapter对象(参考)

    1、通过数据库连接字符串和查询语句来创建:

代码语言:javascript
复制
<span style="font-family:SimSun;">    string strConn,cmdText;
    strConn="server=192.168.24.123;database=DataBaseName;uid=sa;pwd=123456";
    cmdText="select * from TableName";
    SqlDataAdapter sda=new SqlDataAdapter(cmdText,strConn);</span>

    通过观察下面第二种方法就会发现,这种方法有个缺点,如果系统中需要创建多个SqlDataAdapter对象的话,在每次创建SqlDataAdapter对象时,都会“隐式”创建一个SqlConnection对象。

    2、通过SqlConnection对象来创建:

代码语言:javascript
复制
<span style="font-family:SimSun;">    string strConn,cmdText;
    strConn="server=192.168.24.123;database=DataBaseName;uid=sa;pwd=123456";
    cmdText="select * from TableName";
    SqlConnection conn=new SqlConnection(strConn);
    SqlDataAdapter sda=new SqlDataAdapter(cmdText,conn);</span>

    这种方法与第一种方法唯一区别就是多创建了一个SqlConnection对象,这样做的好处是,如果需要再次创建多个SqlDataAdapter对象,只需要改变查询语句cmdText就行,第二个参数还可以使用同一个SqlConnection对象conn,节省系统资源。

    3、通过SqlCommand对象来创建:

代码语言:javascript
复制
<span style="font-family:SimSun;">    string strConn,cmdText;
    strConn="server=192.168.24.123;database=DataBaseName;uid=sa;pwd=123456";
    cmdText="select * from TableName";
    SqlConnection conn=new SqlConnection(strConn);
    SqlCommand cmd=new SqlCommand(cmdText,conn);
    SqlDataAdapter sda=new SqlDataAdapter(ccmd);</span>

       SqlDataAdapter对象其实相当于一个功能更强大的SqlCommand对象,SqlDataAdapter对象中包含了InsertCommand、DeleteCommand、UpdateCommand、SelectCommand、四个对象,分别用来进行增删改查的操作。举例如下:

代码语言:javascript
复制
public static DataTable SelectAll()
    {
        SqlConnection conn=new SqlConnection("server=.;database=Test;uid=sa;pwd=123456");    //创建数据库连接对象
        SqlDataAdapter sda = new SqlDataAdapter();                                           //实例化SqlDataAdapter对象
        sda.SelectCommand = new SqlCommand("select * from Person", conn);                    //创建SqlDataAdapter对象的SelectCommand对象
        DataSet ds = new DataSet();                                                          //实例化DataSet
        sda.Fill(ds, "Person");                                                              //填充DataSet,创建一个Person表并把查询数据放入Person表中
        return ds.Tables["Person"];                                                          //返回Person表的数据
    }

       这里需要注意的是,执行SelectCommand的时候并不需要打开数据库连接对象,如果现在的连接是关闭的话,SelectCommand对象会自动打开数据库连接。

    更多关于SqlDataAdapter的细节可参考:SqlDataAdapter对象

DataSet(http://msdn.microsoft.com/zh-cn/library/system.data.dataset(v=vs.110%29.aspx)[DataTable](http://msdn.microsoft.com/zh-cn/library/system.data.datatable(v=vs.110%29.aspx)

    上面说到的DataReader与SqlCommand一块使用,只能“读取”数据,而无法保存。DataSet可以被认为是内存中的“数据库”,也可以说是数据表的集合。在与SqlDataAdapter断开连接的情况下,DataSet提供了和关系数据库一样的关系数据模型。DataSet由一个或多个表组成,这些表就是DataTable,数据库表DataTable则由DataRow和DataColumn组成。

    下面写一个遍历DataSet的并输出例子(对DataSet写入也是同样的道理):

代码语言:javascript
复制
    DataSet ds=new DataSet();         //实例化DataSet
    //……                            //查询操作(填充DataSet)
    DataTable dt=ds.Tables[0];        //获取DataSet的第一张表(注意第一张表下标为0)
    //遍历行
    foreach(DataRow dr in dt.Rows)
    {
         //遍历列
         for(int i=0;i<dt.Columns.Count;i++)
         {
              Response.Write(dr[i].ToString()+" ");
         }
         Response.Write("<br/>");
    }

小结

      再次引用一下这张图:

       SqlDataReader通常和SqlCommand一同使用,常用语简单浏览并且耗时较短的数据库操作。

       DataSet长与SqlDataAdapter一同使用,DataSet会将所需数据读取到内存然后断开与SqlDataAdapter的连接,在本地内存进行操作,如需更新时在重新通过SqlDataAdapter刷新数据库。

    同时,SqlDataReader、DataSet、DataTable都可以当做数据源直接赋值给某些控件的DataSource属性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年09月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ADO.NET对象
    • 【SqlConnection(http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection(v=vs.110%29.aspx)】
      •  【SqlCommand(http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand(v=vs.110%29.aspx)】
        • 【SqlDataReader】
          •    【SqlDataAdapter】
            • 【DataSet(http://msdn.microsoft.com/zh-cn/library/system.data.dataset(v=vs.110%29.aspx)与[DataTable](http://msdn.microsoft.com/zh-cn/library/system.data.datatable(v=vs.110%29.aspx)】
            • 小结:
            相关产品与服务
            云数据库 SQL Server
            腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档