ADO.NET的五个主要对象

2023-10-27

ADO.NET中的五个主要对象:Connection、Command、DataAdapter DataSet、DataReader详细介绍与应用,感兴趣的朋友可以参考下

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

Connection:

重要属性:

  • ConnectionString 属性,连接字符串,可以通过ConnectionStringBuilder去生成,也可以通过配置文件来配置信息:
<add name="ConStr" connectionString="Data Source=实例名;Initial Catalog=DBName;User ID=****;Password=******" providerName="System.Data.SqlClient" />

  • State 属性,表示 SqlConnection 的状态。为ConnectionState的枚举值,常用包括:
    • Closed:连接已关闭。
    • Open:连接处于打开状态。
SqlConnection connection;
public SqlHelper()
{
    connection = new SqlConnection(ConnectString());
}
//获取连接字符串
private string ConnectionString(){
	return ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
}
//打开连接
private SqlConnection GetConnection(){
	if (connection.State == ConnectionState.Closed)
    {
	    connection.Open();
    }
    return connection;
}
//关闭连接
public void CloseConnection()
{
    if (connection.State == ConnectionState.Open)
    {
       connection.Close();
    }
}

重要方法:

  • Open() 方法,使用由 ConnectionString 指定的属性设置打开一个数据库连接。
  • Close() 方法,关闭与数据库之间的连接。 此方法是关闭任何打开连接的首选方法。
  • Dispose() 方法,执行与释放或重置非托管资源关联的应用程序定义的任务。

Command:

重要属性:

  • Connection ,获取或设置 SqlCommand 的此实例使用的 SqlConnection。
  • CommandText,获取或设置要在数据源中执行的 Transact-SQL 语句、表名或存储过程。
  • Parameters,获取 SqlParameterCollection,用于传递参数对象。
  • Transaction,获取或设置要在其中执行 SqlTransaction 的 SqlCommand。

重要方法:

  • ExecuteNonQuery(),对连接执行 增删改的Transact-SQL 语句并返回受影响的行数。
  • ExecuteReader(),将 CommandText 发送到 Connection,并生成 SqlDataReader对象返回。
  • ExecuteScalar(),执行查询,并返回查询所返回的结果集中第一行的第一列。 忽略其他列或行。
  • Dispose(),执行与释放或重置非托管资源关联的应用程序定义的任务。

重要事件:

  • Disposed,在通过调用 Dispose() 方法释放组件时发生。
/// <summary>
///  执行带参数的增删改SQL语句或存储过程
/// </summary>
/// <param name="cmdText">增删改SQL语句或存储过程名字</param>
/// <param name="ct">命令类型</param>
/// <param name="paras">参数列表</param>
/// <returns></returns>
public int ExecuteNonQuery(string cmdText, CommandType ct, SqlParameter[] paras)
{
    int res;
    using (cmd = new SqlCommand(cmdText, GetConnection()))
    {
        cmd.CommandType = ct;
        cmd.Parameters.AddRange(paras);
        res = cmd.ExecuteNonQuery();
    }
    CloseConnection();
    return res;
}

DataAdapter:

重要属性:

  • SelectCommand,获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。
  • InsertCommand,获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。
  • UpdateCommand,获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。
  • DeleteCommand,获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。

示例代码:

public static SqlDataAdapter CreateCustomerAdapter(
    SqlConnection connection)
{
    SqlDataAdapter adapter = new SqlDataAdapter();

    // 创建 SelectCommand.
    SqlCommand command = new SqlCommand("SELECT * FROM Customers " +
        "WHERE Country = @Country AND City = @City", connection);

    // 添加参数到 SelectCommand.
    command.Parameters.Add("@Country", SqlDbType.NVarChar, 15);
    command.Parameters.Add("@City", SqlDbType.NVarChar, 15);

    adapter.SelectCommand = command;

    // 创建 InsertCommand.
    command = new SqlCommand(
        "INSERT INTO Customers (CustomerID, CompanyName) " +
        "VALUES (@CustomerID, @CompanyName)", connection);

    // 添加参数到 InsertCommand.
    command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
    command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");

    adapter.InsertCommand = command;

    // 创建 UpdateCommand.
    command = new SqlCommand(
        "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
        "WHERE CustomerID = @oldCustomerID", connection);

    // 添加参数到 UpdateCommand.
    command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
    command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
    SqlParameter parameter = command.Parameters.Add(
        "@oldCustomerID", SqlDbType.NChar, 5, "CustomerID");
    parameter.SourceVersion = DataRowVersion.Original;

    adapter.UpdateCommand = command;

    // 创建 DeleteCommand.
    command = new SqlCommand(
        "DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);

    // 添加参数到 DeleteCommand.
    parameter = command.Parameters.Add(
        "@CustomerID", SqlDbType.NChar, 5, "CustomerID");
    parameter.SourceVersion = DataRowVersion.Original;

    adapter.DeleteCommand = command;

    return adapter;
}
/// <summary>
///  执行带参数的查询SQL语句或存储过程
/// </summary>
/// <param name="cmdText">查询SQL语句或存储过程名字</param>
/// <param name="ct">命令类型</param>
/// <param name="paras">参数集合</param>
/// <returns>返回DataSet结果集</returns>
public DataSet ExecuteQuery(string cmdText, CommandType ct, SqlParameter[] paras)
{
    cmd = new SqlCommand(cmdText, GetConnection());
    cmd.CommandType = ct;
	cmd.Parameters.AddRange(paras);
	SqlDataAdapter da = new SqlDataAdapter(cmd);
	DataSet ds = new DataSet();
	da.Fill(ds);
	CloseConnection();
	return ds;
}

重要方法:

  • Fill方法,填充数据集。通常会向DataSet中填充。
  • Update方法,更新数据源。

DataSet:

  1. DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。也就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的。
  2. 创建和刷新 DataSet 并依次更新原始数据的步骤:
    • 通过 DataAdapter 使用数据源中的数据生成和填充 DataSet 中的每个 DataTable。
    • 通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。
    • 调用 DataAdapter 的 Update 方法,并将第二个 DataSet 作为参数传递。
  3. DataSet所有数据都加载在内存上执行的,可以提高数据访问速度,提高硬盘数据的安全性,极大的改善了程序运行的速度和稳定性。
  4. 每一个DataSet对象是由若干个 DataTable对象组成。
  5. DataSet使用方法:
    • 把数据库中的数据通过DataAdapter对象填充DataSet。
    • 通过DataAdapter对象操作DataSet实现更新数据库。
  6. DataSet对象的三大特性
    • 独立性。DataSet独立于各种数据源。
    • 离线(断开)和连接。
    • DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。

DataReader:

若要创建 SqlDataReader ,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不是直接使用构造函数。

在使用SqlDataReader时,关联的SqlConnection正忙于为SqlDataReader提供服务,除了关闭它之外,不能在SqlConnection上执行其他操作。直到调用SqlDataReader的Close方法之前都是这样。例如,只有在调用Close之后才能检索输出参数

重要属性:

  • Connection,获取与 SqlConnection 关联的 SqlDataReader。
  • FieldCount,获取当前行中的列数。
  • HasRows,获取一个值,该值指示 SqlDataReader 是否包含一行还是多行。
  • IsClosed,检索一个布尔值,该值指示是否已关闭指定的 SqlDataReader 实例。
  • Item[Int32],在给定列序号的情况下,获取指定列的以本机格式表示的值。
  • Item[String],在给定列名称的情况下,获取指定列的以本机格式表示的值。

重要方法:

  • Close(),关闭 SqlDataReader 对象。
  • Dispose(),释放 DbDataReader 类的当前实例所使用的所有资源。
  • Read(),让 SqlDataReader 前进到下一条记录。
/// <summary>
/// 执行带参数的查询SQL语句或存储过程
/// </summary>
/// <param name="cmdText">查询SQL语句或存储过程名字</param>
/// <param name="ct">命令类型</param>
/// <param name="paras">参数集合</param>
/// <returns>返回DataReader结果集</returns>
public SqlDataReader ExecuteReader(string cmdText, CommandType ct, SqlParameter[] paras)
{
    cmd = new SqlCommand(cmdText, GetConnection());
	cmd.CommandType = ct;
	cmd.Parameters.AddRange(paras);
    try
	{
		reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        cmd.Parameters.Clear();
        return reader;
	}
	catch
    {
		connection.Close();
        throw;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ADO.NET的五个主要对象 的相关文章

  • 用于创建断开连接的数据库应用程序的最佳基于 .NET3.5 的策略

    我的要求是 相对较小的数据库 25 30 个表 每个表有 4 5k 行 4 5 个用户在其笔记本电脑上拥有自己的本地数据库副本 在需要时或一天结束时进行同步 免费解决方案 正如我为 NFP 组织进行的设置一样 过去几天我一直在研究各种选择
  • 如何为 ADO.NET 拆分 Oracle sql 语句

    拆分 SQL 语句以发送到 Oracle ADO NET 客户端的正确方法是什么 例如 假设您在文本文件中有以下代码并且想要执行这些语句 CREATE TABLE foo bar VARCHAR2 100 INSERT INTO foo b
  • 数据视图和数据表有什么区别?

    NET 中的 DataView 和 DataTable 有什么区别 据我了解 DataView只是DataTable的错误呈现 我什么时候应该使用 DataView 当您想要运行查询并在控件中显示数据子集时 DataView 可以帮助您 这
  • ADO.Net (Azure AD) 错误“不支持关键字:身份验证”

    我正在尝试通过 C 代码使用 Azure AD 凭据连接到 Azure 数据库 代码如下 它在我的系统上运行良好 但是当我将它部署到32位VM时 它显示错误 不支持关键字 身份验证 VM 安装了 Net Framework 4 5 但未安装
  • .NET 系统类型到 SqlDbType

    我一直在寻找 Net System Type 和 SqlDbType 之间的智能转换 我发现这是以下想法 private static SqlDbType TypeToSqlDbType Type t String name t Name
  • 在数据表过滤器表达式中转义字符的正确方法

    我想知道是否有一个函数可以正确转义过滤器表达式的字符串文字 例如 DataTable Select String Format name 0 MyName 如果 MyName 包含 或许多其他关键字符 则会生成异常 这微软文档 http m
  • 使用 Active Directory 集成身份验证的 Azure SQL 数据库连接无法打开

    我正在尝试使用类似于以下内容的连接字符串通过实体框架连接到 Azure SQL 数据库 Data Source
  • SQL - 是否有更好的方法将用于 where 子句的键列表传递到存储过程中?

    这是场景 我有一个清单客户ID 1 2 3 具有相关性OrderIds 我有一个存储过程Delete OrdersByCustomerIds 删除与该订单相关的所有订单客户ID指定的 目前 我这样做的方法是将客户ID转换为字符串 即 1 2
  • 增加 SQL 命令的命令超时

    我有一个小问题 希望有人能给我一些建议 我正在运行一个 SQL 命令 但由于数据量很大 该命令似乎需要大约 2 分钟才能返回数据 但默认的连接时间是 30 秒 我如何增加这个时间 并将其应用到这个命令 public static DataT
  • 是否需要显式事务回滚?

    许多例子都主张显式回滚数据库事务 大致如下 using var transaction try do some reading and or writing here transaction Commit catch SqlExceptio
  • 使用字典键和值填充 DataGridViewComboBoxColumn

    我有一本字典 其键为三个字母的国家 地区代码 其值为国家 地区名称 Dictionary
  • ALL 的 SQL 参数

    我想知道SQL中是否有一个参数适用于所有 不是 例如 我现在正在编写一个搜索表 如果用户不在文本框中输入某些内容 则意味着忽略该特定参数并显示该字段的所有内容 我知道您可以为每种情况创建单独的 OLEDB 或 SQL 命令 并且它会起作用
  • 位置 0 处没有行

    cmd CommandText select from product where prod code Trim txtprod code Text and branch w location and avail stock lt gt 0
  • SSIS - 将参数传递给 ADO .NET 源查询

    我知道早些时候已经有人问过这个问题 大多数答案都不相关 谷歌了一下 显示解决办法是在 数据流任务 中配置表达式并设置查询 然而 在 ADO NET 源中 当我尝试预览输出时 我不断收到 Must declare the variable 它
  • 如何将存储过程结果映射到自定义类?

    我在用entity framework 5我已经添加了两个存储过程到我的 edmx model 第一个存储过程返回一个字符串 如果我在 Visual Studio 中打开模型浏览器 我可以更改Returns a Collection Of节
  • 元数据集合中不存在标识为“ ”的成员。\r\n参数名称: Identity

    我在尝试调试时稍微简化了代码 HttpPost public ActionResult Register User model DateTime bla new DateTime 2012 12 12 try User user new U
  • 使用AOP技术拦截ADO.Net

    我有相当大的代码库 使用各种不同的 ADO 技术 即一些 EF 在某些情况下直接使用 ADO Net 我想知道是否有任何方法可以全局拦截任何 ADO Net 调用 以便我可以开始审核信息 例如执行的确切 SQL 语句 花费的时间 返回的结果
  • SqlException超时未达到

    我们的服务器有时会抛出这个众所周知的异常 超时已过 操作完成之前超时时间已过 或者服务器未响应 当服务器处理大请求时 这种情况会在压力下发生 我做了一些研究 发现我可以改变连接字符串连接超时设置和 或SqlCommand 超时数据读取器属性
  • 如何使用Not In datatable.select

    我有一个带有 状态 列的数据表 Ado Net 此列保存值 在每个记录中 红色 绿色 蓝色 黄色 白色 其他颜色 我想选择状态值不是红色 绿色 蓝色的所有行 使用哪种过滤表达式来根据我建议的标准选择数据 所以我想实现一些像我们在 sql 查
  • 将unix时间转换为字符串的Powershell函数?

    我正在尝试使用 ADO NET 和 PowerShell 读取 Firefox place sqlite datedase 的日期字段 显然这些字段是 Unix 时间的 我正在寻找 Net 日期时间或字符串的转换 Edit 我想将数据行绑定

随机推荐

  • C/C++为什么总喜欢用u16 u8 这样的声明类型啊

    2012 12 05 09 54 RT 为什么要这么定义 它们表示什么意思啊 有识别它们的规律吗 老是不知道它们是什么意思 还有s16呢 这样写非常直观 不用担心平台的不同可移植性好 它的字节数一看就知道 u6是16位2个字节 u8一个字节
  • Docker入门常规操作

    启动Docker环境 systemctl start docker 停止Docker环境 systemctl stop docker 重启Docker环境 systemctl restart docker 查看所有镜像 docker ima
  • Unity Graphics (Unity 图形渲染 ) 官方教程文档笔记系列之十三

    Unity Graphics Unity 图形渲染 Everything for Lighting and Rendering in Unity 主要涉及到光照与渲染方面的知识 本文档主要是对Unity官方教程的个人理解与总结 其实以翻译记
  • Bilibili自动签到脚本

    作者 三十三重天 博客 http www zhouhuibo club 通过学习和分享的过程 将自己工作中的问题和技术总结输出 希望菜鸟和老鸟都能通过自己的文章收获新的知识 并付诸实施 脚本介绍 这是一个利用 Linux Crontab G
  • 踩坑修改el-input样式

    修改el input样式
  • PCL 曲面重建 迫松重建

    一 算法原理 迫松重建法是一种基于隐式函数的三角网格重建算法 该方法通过对点云数据进行最优化的插值处理之后来获取近似的曲面 泊松曲面重建 jennychenhit的博客 CSDN博客 泊松曲面重建 迫松曲面重建的过程 1 定义八叉树 使用八
  • 如何修改Microsoft edge浏览器主页?

    目录 原因 1 主页被劫持 2 只是想改主页 解决办法 1 还原 2 更改 原因 1 主页被劫持 你是否因为打开Microsoft edge浏览器没有显示原本的主页 而是显示其它浏览器的主页 比如360浏览器或者其它的浏览器 而且广告也挺多
  • CSS样式如何使用?

    css是专门用来 美化 标签 基础CSS 写简单页面 看懂 学会改 模块 调整和修改 1 快速了解 img src style height 100px div style color red 中国联通 div 2 CSS应用方式 1 在标
  • GIT GUI(git的可视化工具)

    目录 一 前言 二 Git和GitHub通过密钥绑定 三 把本地文件夹进行git初始化 四 通过Git Gui上传文件至GitHub 一 前言 GIT官方网站为了解决部分用户通过命令行对git工具使用时的怨声载道的现象 因此推出了一个GIT
  • mc显示未发现java_mc命令编译一直报错, 提示找不到JavaInfo.jar

    x 我已经在 issues 里搜索 没有重复的issue 环境信息 arthas boot jar 或者 as sh 的版本 3 1 1 Arthas 版本 3 1 1 操作系统版本 Cent7 5 目标进程的JVM版本 JDK8 执行ar
  • Vue 和 React 的对比

    目录 前言 一 vue2 与 react 15 的对比 1 vue2 与 react 15 的相同点 2 vue2 与 react 15 的不同点 1 数据流的不同 2 框架本质不同 3 模板不同 4 组件通信方式不同 5 组合不同功能的方
  • 【c++实战项目】——云备份服务器

    项目介绍 云备份服务器能够通过浏览器将文件上传到服务器上 并且随时可以通过浏览器进行查看并且下载 其中下载的过程支持断点续传 服务器上有热点管理模块 将非热点文件进行压缩存储 节省服务器的磁盘空间 服务器各个模块的功能介绍 配置文件管理模块
  • JAVA 日期工具类(全面,代码可以直接使用)

    这是一个比较全面的时间工具类 可供参考 import cn hutool core date DatePattern import cn hutool core date DateTime import cn hutool core uti
  • VTM新手踩坑

    VTM踩坑实录 1 编码后yuv文件打开异常 2 编码帧数偏少 3 VTM命令行参数 1 编码后yuv文件打开异常 利用ffmpeg播放改文件 命令行 ffplay video size 宽x高 i file name yuv 时出现该画面
  • 入行 AI 训练营限时报名!

    作为码农一枚 近来这一年左右时间里 连续发生了多件事情 使得笔者不得不抬起原本一直低着敲代码的头 看看这个为 AI 狂欢的世界 01 算法 工程和数据 我们不说怎么能够成为XXX 我们先来看看成为XXX之后要做什么事情 而做这些事情 需要什
  • 点击延迟_TWS耳机可以测试延迟啦!“Latency Test”软件详细操作流程

    配备耳机孔的手机越来越少 蓝牙耳机已经成为大势所趋 然而和传统的有线耳机相比 蓝牙耳机始终存在一些硬伤 例如电量 成本以及延迟 延迟这一点 其实一直被很多人所诟病 用蓝牙耳机看视频影音不同步啦 玩音游总是打不到拍子上啦 这些情况都得怪蓝牙耳
  • 移动端 视角移动冲突 解决Input.GetAxis()

    不用它 用 Input GetTouch i detalPosition x
  • 使用xmanager 远程操作linux

    随着互联网的高速发展以及Linux企业应用的成熟 Linux被广泛应用于服务器领域 如何实现Linux的远程管理成为网络管理员的首要任务 我们经常见到的几种最为常用的windows下远程管理Linux服务器的方法 基本上都是利用Secure
  • NPM使用技巧

    NPM使用技巧 前言 技巧 全局模块位置 PowerShell报错 安装模块冲突 NPM介绍 NPM命令 使用方法 基本命令 模块命令 查看模块 运行命令 镜像管理 常用模块 rimraf yarn 前言 本文包含NodeJS中NPM包管理
  • ADO.NET的五个主要对象

    文章目录 Connection Command DataAdapter DataSet DataReader ADO NET中的五个主要对象 Connection Command DataAdapter DataSet DataReader