侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ADO.NET数据库访问技术

数据库  /  管理员 发布于 6年前   403

一. ADO.NET的定义


ADO.NET来源于COM组件库ADO(即ActiveX Data Objects),是微软公司新一代.NET数据库的访问模型,是目前数据库程序设计人员用来开发基于.NET的数据库应用程序的主要接口。它利用.NET Data Provider(数据提供程序)进行数据库的连接和访问,通过ADO.NET数据库程序能够使用各种对象来访问符合条件的数据库内容,让提供数据库管理系统的各个厂商可以根据此标准开放对应的.NET Data Provider,这样设计数据库应用程序人员不必了解各类数据库底层运作的细节,只要掌握ADO.NET所提供对象的模型,便可访问所有支持.NET Data Provider的数据库。

ADO.NET结构模型如下所示:

 图1. ADO.NET结构模型

  ADO.NET是一个类库,这些类提供了很多的对象,可用于完成数据库连接和增删查改等操作。其中包括如下五个对象: 1)Connection:用来连接数据库(SQL Server使用的是SqlConnection对象); 2)Command:用来对数据库执行SQL命令,如增删查改等操作; 3)DataReader:用来从数据库中返回只读数据,用数据源填充DataSet对象; 4)DataAdapter:与DataSet对象相结合使用,实现对数据库的控制; 5)DataSet:可看作离线时内存中的数据库; 这五个对象提供了两种读取数据库的方式; 第一种方式:使用Connection、Command、DataReader,其权限只能读取或查询数据库; 第二种方式:使用Connection、Command、DataAdapter、DataSet,其权限能进行各种数据库的操作。 ADO.NET读取数据库操作示意图: 

图1. ADO.NET结构模型

 
二. 使用ADO.NET在线访问数据库的步骤(这里用的是SQL Server 数据库)
 
1. 连接数据库
直接上一段代码:

using System.Data.SqlClient;string source = "server=(local); integrated security=SSPI; database=myDateabase;User ID=sa;pwd=sa"; SqlConnection conn = new SqlConnection(source); conn.Open(); // 对数据库数据进行操作 conn.Close();


  (1). 首先添加命名空间System.Data.SqlClient;

(2). 定义数据库连接字符串:

第一种方法:直接把数据库连接字符串存放在字符串对象中,如上代码所示;

第二种方法Web:将数据库连接信息存放在web.config配置文件中,然后通过使用ConfigurationStringSettings类进行调用。来个例子说明一下:

(a). 首先,在web.config配置文件的部分定义数据库连接信息:

<configuration><connectionStrings><add name="myDatabase" connectionString="server=(local); integrated security=SSPI; database=myDateabase;User ID=sa;pwd=sa" providerName="System.Data.SqlClient" /></connectionStrings></configuration>


(b). 在项目文件中,添加对Configuration的引用,在头部添加using System.Configuration。然后定义数据库连接字符串为:

复制代码 代码如下:string connstring = ConfigurationManager.ConnectionStrings["myDatabase"].ConnectionString;


备注:必须添加对System.Configuration程序集的引用,才能解析上述代码中使用的ConfigurationManager类。

2. 创建数据库连接
1)创建Connection对象:

string conn = new SqlConnection(connString); 

2)打开数据库: conn.Open(); 一般情况下,当在.NET中使用“稀缺”的资源时,如数据库连接、窗口或图形对象,最好确保每个资源在使用完毕后立即关闭。尽管.NET的设计人员实现了自动垃圾收集机制,垃圾最终会被回收,但仍需要尽可能早地释放资源,以避免出现资源匮乏的情况。 当编写访问数据库的代码时,因为使连接打开的时间略长于需要的时间,就可能影响其他会话。在极端的情况下,不关闭连接可能会使其他用户无法进入一整组数据表,极大地降低应用程序的性能。主要有两种方式可以确保数据库连接等类似的“稀缺”资源在使用完后立即释放。这两种方式如下: (1)第一种方式:采用try...catch...finally语句块 确保在finally中关闭任何已打开的连接。

try { // open the connection conn.Open(); // 对数据库数据进行操作 } catch (SqlException ex) { // log the exception } finally { conn.Close(); }


在给定的方法中可能会打开许多资源,这样try...catch...finally块的层次有时候不容易看清。还有一种方式可以确保资源的关闭――using语句。 (2)使用using语句块

using(SqlConnection conn = new SqlConnection(connstring)){ // Open the connection conn.Open(); // 对数据库数据进行操作 }


无论块是如何退出的,using子句都会确保关闭数据库连接。 

 
3. 创建数据库操作命令:


Connection对象与数据源建立连接后,使用Command对象对数据源执行查询、插入、修改和删除等操作。

(1) 创建SQL数据库操作命令: sqlQuery查询语句具体规则请详见我的系列文章:【读书笔记】SQL Server查询语句_邓智容 (2) 创建Command对象:

(a). 方法一:

复制代码 代码如下:SqlCommand command = new SqlCommand(); command.Connection = conn; command.CommandText = "SQL语句";

(b). 方法二:

SqlCommand command = new SqlCommand("SQL语句", conn); 

备注: 1). SQL查询语句若含有C#程序的变量并以字符串形式连接,则应注意数据为非数字的变量应用单引号括起来; 2). 在SQL查询语句中使用参数化查询语句的话,譬如:

command.CommandText = "SELECT * FROM myTable WHERE siteName=@siteName"; 

当需要给该参数赋值时,可以使用Command对象建立参数对象,然后再赋值:

复制代码 代码如下:command.Parameters.Add(new SqlParameter(@siteName, siteName)); command.Parameters["@siteName"].Value = "http://#";

备注: 在.Net Framework 2.0中SqlClient增加了AddWithValue(string parameterName, object value)方法。该方法简化了调用储存过程的输入参数过程,在运行时对所输入的数据类型进行判断,获取对应的数据库类型。 因此该方法在运行效率上比用 Add(string parameterName, SqlDbType sqlDbType, int size, string sourceColumn)方法要低。 在效率要求较高的地方仍然建议使用Add()方法,其它场合可以使用AddWithValue()简化代码编写量。

 
4. 执行sqlQuery命令:


定义好命令后,就需要执行它。执行的语句有多种方式,这取决于要从命令中返回什么数据。Command类提供了下述可执行的命令: (1) ExecuteNonQuery() ―― 执行命令,但不返回任何结果。一般用于UPDATE、INSERT或DELETE语句中,其中唯一的返回值是受影响的记录个数。但如果调用带有输出参数的存储过程,该方法就有返回值。 (2) ExecuteReader() ―― 执行命令,返回一个类型化的IDataReader。是从数据源中选择某些数据的最简单快捷的方法。 (3) ExecuteScalar() ―― 执行命令,返回结果集中的第一行第一列的值。

 
5. 对数据库操作完毕后关闭数据库连接:


conn.Close();

 
三. 离线数据库访问


DataAdapter对象主要在Connection对象和DataSet对象之间执行数据的传输工作,将数据填充到DataSet对象中,也可把DataSet对象更新后的数据返回到数据源中,也可架构在Command对象上,通过CommandBuilding对象生成DataAdapter的Insert、Update和Delete等SQL操作命令。使用DataSet和DataTable对象访问数据源后,ADO.NET会自动离线,在内存中处理数据,如有修改数据的操作,将自动重新连接数据源,更新数据库。DataSet对象、DataAdapter对象与数据源之间的关系如下:

DataSet <---> DataAdapter <---> 数据源
下面是使用DataAdapter进行离线数据库访问的操作步骤:

1. 创建DataAdapter、DataTable对象(使用的是SQL Server数据库)

复制代码 代码如下:SqlAdapter da = new SqlAdapter("sqlQuery查询语句", conn); DataSet = ds = new DataSet(); DataTable dt = new DataTable();

2. 将数据填充到DataTable对象

da.Fill(ds, "TableName"); dt = ds.Tables["TableName"]; 

3. 对DataTable中的数据进行处理 TataTable对象的属性和方法有: 

名称 属性/方法 说明
Rows.Add() 方法 插入新数据行
Rows[n].Delete() 方法 删除第n行的记录
Rows.Count 属性 获取行数
Rows[i]["ColumnName"] 属性 获取第i行、列名为ColumnName的值
Rows[i][j] 属性 获取第i行、第j列的值
 
  还有一种数据查询技术:LINQ。下回再讨论。

通过以上对ADO.NET数据库访问技术的介绍,希望对大家有所帮助。


  • 上一条:
    Access转成SQL数据库的方法
    下一条:
    超大数据量存储常用数据库分表分库算法总结
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客