题记 每一事物的产生和存在都有其特定的理由。


 理论:ADO.NET是一组与数据源进行交互的面向对象类库。通常情况下数据源就是数据库,当然同样也能是文本文件,Excel表格或XML文件,我们知道的数据库有多种,例如SQLServer,Access,Oracle ,DB2等等,因为不同的数据源采用不同的协议,例如有的数据源使用ODBC协议,有的使用OleDb协议。而这些数据源都可以通过ADO.NET来进行连接。换句话说就是ADO.NET提供对SQLServer,Access等数据源的一致访问。如下图:

ADO.NET的结构主要包括两个核心组件:DataSet和.NETFramework数据提供程序。

DataSet:我们可以把它当成内存中的数据库,也可以说Dataset是数据表的集合,它可以包含任意一个数据表(Datable)。 DataSet 具有三个大的特性:1.独立性,DataSet独立于各种数据源;2.断开和连接;3.DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。.NET Framework 数据提供程序是专门为数据操作以及快速,只进,只读访问数据而设计的组件。

 

ADO.NET操作数据库访问结构图:

从上图中可以看出.NET Framework提供的核心元素是:

1.Connection对象提供与数据库的连接

2.Command类是在成功与数据库连接之后,用Command对象来执行查询,修改,插入,删除等命令

      3.DataReader对象:通过Command对象提供从数据库检索数据信息的功能。DataReader对象是以一种只读的、向前的、快速的方式访问数据库。

       4.DataAdapter对象:是DataSet和数据源之间的桥梁。它通过映射Fill()方法来填充DataSet对象,通过Update()方法更新数据源中的数据。如果所连接的是Sql Server,可以通过将SqlDataAdapter与关联的SqlCommand和SqlConnection对象一起连用,从而提高性能。

      5.DataTable对象: 是一个临时保存数据的一个网格虚拟表(表示内存中数据的一个表),包括行和列。

       

      实践:ADO.NET操作数据库(以Sql Server为例)


 1.命名空间引用:using System.Data.SqlClient

 2.成员:SqlConnection SqlCommand SqlDataReader,SqlDataAdaPter,Dataset

3.Connection:和数据库交互,必须连接它,它的作用相当于是在程序与数据库服务器之间建立一条通路。因此如果Connection连接不成功,所有的数据库操作都成空谈。Connection指明数据库服务器,数据库名字,用户名和密码,和连接数据库所需要的其他参数。

例如:

  • 1.定义连接字符串:string Connstr ="data source=数据库服务器名;initial catalog=数据库名;user id=连接用户名;password=密码;"

字符串连接网址:http://www.connectionstrings.com/

  • 2.创建Connection对象:SqlConnectionconn=new SqlConnection(connstr)
  • 3.打开与数据库的连接:conn.Open();

注意:由于数据库连接会出现异常,因此一般用Try_CATCH来捕获当数据库连接成功之后,再进行数据库操作。

4.Command:如果说Connection好比是一条通路,那么Command类就相当于是在通路上来回跑的车辆,如果缺少它,在程序中所有对数据库的操作无法传递给数据库服务器。因此,可以说Connection和Command组成ADO.NET的基础。

注意:

1.设置CommandText和CommandType属性,一般情况下不需要设置CommandType属性,但是如果执行存储过程,则需要设        置CommandType属性为StoredProcedure。

2.建议多使用参数,减少字符串的直接拼,可以防止SQL注入,例如下面的查询例子:

   Dim sql As String = "select * from T_USER where UserID=@UserID"
Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dim params As SqlParameter = New SqlParameter("@UserID", Iuser.UserID)
cmd.Parameters.Add(params) Dim reader As SqlDataReader
Try
conn.Open() reader = cmd.ExecuteReader
reader.Read()
Iuser.UserID = Trim(reader.Item("UserID"))
Iuser.UserPwd = Trim(reader.Item("UserPwd"))
Iuser.Level = Trim(reader.Item("Level"))
Return Iuser Catch ex As Exception Iuser.UserID = ""
Return Iuser End Try

 注意:Command 对象中的ExecuteNonQuery方法和ExecuteReader方法,由于没有弄清楚这两个,在做机房收费系统项目的时候,就出错了,调试的时候,调试了很长时间。 
       ExecuteNonQuery方法主要是处理非查询类型的语句,返回的个数是受影响的个数,但其对“INSERT”语句是不起任何作用的;而ExecuteReader方法主要是处理查询语句,但是需要借助DataReader来辅助操作。

 5.DataReader:就像上面的例子一样,想要获得查询的记录集,仅仅依靠Command是无法完成的,还需要借助DataReader来读取查询的记录,需要说明的是DataReader仅仅获取的是一行记录。DataReader比较常用的方法是:Read()和GetValue  ,前者是让DataReader 读取下一笔记录,如果有读到数据则传回True,若没有纪录则传回False。或者是获得某个字段的值,返回Object类型对象,需要进行类型转换才能得到某字段的值。

 6.DataAdapter:可惜的是DataReader只能读取一行记录,为了弥补这个不足,ADO.NET提供了一个更好的,更方便的数据库操作,即DataAdapter类。对于一个DataAdapter类,可以设置四个Command属性,分别是SelectCommand,返回数据源的数据;InsertCommand、UpdateCommand和DeleteCommand用于管理数据源中的更改。调用DataAdapter的Fill方法之前必须设置SelectCommand属性,在调用Update方法之前必须设置InsertCommand、UpdateCommand或DeleteCommand属性,具体取决于DataTable中的数据做了哪些更改。换句话说这四个Command并不需要全部初始化,主要是看程序的具体要求,如果只需要用到查询方面,只设定一下SelectCommand即可。

DataAdapter操作返回的记录集,往往需要用DataSet来进行辅助操作。下面是一个查询充值记录例子,用DataAdapter的Fill方法对DataSet进行填充。

  Dim sql As String = "select CardNo as 卡号,addCash as 充值金额,RechargeDate as 充值日期,RechargeTime as 充值时间,UserID as 充值教师 from T_RECHARGE where CardNo=@CardNo"

        Dim cmd As SqlCommand = New SqlCommand(sql, conn)
Dim params As SqlParameter() = New SqlParameter() {New SqlParameter("CardNo", CardNo)} cmd.Parameters.AddRange(params) Dim myAdapter As SqlDataAdapter = New SqlDataAdapter(cmd)
Dim mySet As New DataSet()
Dim myTable As New DataTable Try
conn.Open() myAdapter.Fill(mySet, "充值表")
myTable = mySet.Tables("充值表") conn.Close() Return myTable Catch ex As Exception Return myTable End Try

其实,相对而言,DataAdapter效率要更差一些,读取速度远远没有DataReader来的快,但是为了避免一些操作,如获取记录集,对获得数据的记录进行类型转换等等,所以更建议多使用DataAdapter!

以上是在敲机房收费系统过程中对ADO.NET的一点认识,后面会随着对机房收费系统的进一步实践,会将ADO.NET运用于实践中,相信在更多的实践中,会有更深刻的认识。

ADO.NET理论+实践的更多相关文章

  1. [Java并发编程(四)] Java volatile 的理论实践

    [Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...

  2. Innovus教程 - Flow系列 - MMMC分析环境的配置概述(理论+实践+命令)

    本文转自:自己的微信公众号<集成电路设计及EDA教程> <Innovus教程 - Flow系列 - MMMC分析环境的配置概述(理论+实践+命令)>   轻轻走过,悄悄看过,无 ...

  3. PT教程 - 应用系列 - ECO修复Timing(理论+实践+脚本分享)

    ​本文转自:自己的微信公众号<集成电路设计及EDA教程> <PT教程 - 应用系列 - ECO修复Timing(理论+实践+脚本分享)> 这篇推文讲一下数字IC设计中的post ...

  4. ICC教程 - Flow系列 - 概念系列 - ECO (理论+实践+脚本分享)

    本文转自:自己的微信公众号<集成电路设计及EDA教程> <ICC教程 - Flow系列 - 概念系列 - ECO (理论+实践+脚本分享)> 这篇推文讲一下数字IC设计中的po ...

  5. 【SSH2(理论+实践)】--Hibernate步步(一个)

    前几个博客讨论SSH2该框架Struts,它代表层,集成封装.和使用WebWork作为核心处理,依赖映射是它的处理核心.在使用时需要Struts.xml配置相应Action和Interceptor够完 ...

  6. 【SSH2(理论+实践)】--图说Struts2的执行

        前几篇文章讨论了有关Struts2的核心机制及一些基础,但同一时候也遗留下了非常多问题.这些问题主要是针对Struts2的一些使用技巧的,该篇文章将会针对Struts2的使用技巧进行讨论, ...

  7. 理论+实践解析“IT治理”之模式与原则

    IT治理工作作为企业信息化建设的上层建筑,扮演着及其重要的角色.本文结合作者的学习及实践经验给出一些借鉴. 一.IT治理概述 1.1 何为IT治理 在企业信息化建设中的最大问题,往往不是技术问题,也不 ...

  8. Java自动化测试框架-02 - TestNG之理论实践 - 纸上得来终觉浅,绝知此事要躬行(详细教程)

    理论 TestNG,即Testing, NextGeneration,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用 ...

  9. MSMQ理论+实践(上)

    关于MSMQ使用的文章,网上一搜一大把,为什么还要写呢?因为别人的终究是别人的,看一遍,只是过眼云烟罢了,还是要自己动手实践一下,才能把别人的变成自己的.再者就是网上大都是在一台电脑上写的demo,我 ...

随机推荐

  1. JAVA中Collection接口和Map接口的主要实现类

    Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素 ...

  2. OracleDBConsoleorcl 启动不了 服务特定错误2【解决办法】

    问题描述: 我的oracle不知道为什么OracleDBConsoleorcl 启动不了 出现“服务特定错误2”现在我也不知道原因 估计是因为我电脑的IP经常变动,有时在公司用,有时在家里用! 我的o ...

  3. 六、vue路由Vue Router

    一.基本概念 route, routes, router 1, route,它是一条路由,由这个英文单词也可以看出来,它是单数, Home按钮  => home内容, 这是一条route,  a ...

  4. java 异常说明

    异常说明使用了附加的关键字 throws ,后面接一个所有潜在异常类型的列表,方便客户端程序员查看. public static void main(String[] args) throws Nul ...

  5. AJAX请求时status返回状态明细表(转)

    转自:http://www.cnblogs.com/wangking/p/6530904.html AJAX请求时status返回状态明细表 readyState的五种状态2010-03-04 18: ...

  6. .NetCore使用Swagger进行单版本或多版本控制处理

    前面已经介绍过了Swagger的基础使用了 下面继续分别详细说明下 不添加版本控制以及添加版本控制的使用情况,其实也基本一致,对看起来可能更加容易理解 第一步 导入nuget包 nuget导入Swas ...

  7. 【转】Git命令大全(非常齐全)

    $ git init  // 初始化一个Git仓库$ git status   // 查看仓库的状态$ git add .   // 将所有修改添加到暂存区$ git add *  // Ant风格添 ...

  8. 黑马程序员_java基础笔记(13)...类加载器和代理

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1,类加载器.2,代理. 1,类加载器. Java虚拟机中可以安装多个类加载器,系 ...

  9. 【已解决】Chrome提示:"请停用以开发者模式运行的扩展程序"的解决办法

    chrome用户在安装了一些第三方的chrome插件后,每次打开浏览器的时候都会出现“请停用以开发者模式运行的扩展程序”的提示,只有每次点击取消之后才能正常使用扩展.如下图所示 那么有没有什么方法可以 ...

  10. P2429 制杖题

    P2429 制杖题这个题用线性筛会WA一个点,因为这个题是给定的质数集,最大的质数会比当前的倍数大,就会出现上面的情况.怎办?判重用set啊!set+线性筛就过掉了.16ms #include< ...