ADO.NET访问数据-(2) DataSet本地缓存与数据库的交互过程,以及应用

简介: 大半夜的睡不着觉 ,被宿舍的一群狼给吵醒了,于是就继续写博客。。。。       在前面一个 ADO.NET  数据库文章中  我说过  ADO.NET  允许用户在断网的情况下 对数据库进行 "操作" ,注意这里的操作 我带了 引号 !!!     其实在ADO.NET 中  我们可以先从数据库将 一个数据库的子集下载 到本地内存中,然后这个子集 会驻留在客户机中,这时候 我们对数据库的修改 实际上是对 本地缓存的    修改,等一切操作完成之后 ,我们再将位于本地缓存中经过修改后的数据库子集 反映到数据源。

大半夜的睡不着觉 ,被宿舍的一群狼给吵醒了,于是就继续写博客。。。。  

 

  在前面一个 ADO.NET  数据库文章中  我说过  ADO.NET  允许用户在断网的情况下 对数据库进行 "操作" ,注意这里的操作 我带了 引号 !!!

    其实在ADO.NET 中  我们可以先从数据库将 一个数据库的子集下载 到本地内存中,然后这个子集 会驻留在客户机中,这时候 我们对数据库的修改 实际上是对 本地缓存的

   修改,等一切操作完成之后 ,我们再将位于本地缓存中经过修改后的数据库子集 反映到数据源。  所以在将数据库子集下载到本地之后,那么网络连接不连接 都不重要了 ,只要我们在最后提交修改的时候 我们连接上网络 就 OK了 。 

    那么什么时候用到 DataSet呢?   

    你可能有过这样 的经历,在网上购物的时候 是不是在选择后 货物之后 进行一次性提交?  

     对,就是这样 ,这样做的目的就是为了减少网络流量,减少资源的消耗 ,以及预防异客户机常断开网络时的非完整性操作   。 

    假如我们每进行一次操作那么都进行数据库的 读取或写入操作 那么 对网络资源的消耗是非常大的 ,DataSet很好的解决了这个问题  。

     

使用这个技术就要明白几个概念 ,当初我学习的时候 ,一直纠结着我的问题 !!!

 

 ConnectionString

 ("Data Source=.\SQLEXPRESS;Initial Catalog=StudentSystem;Persist Security Info=True;User ID=sa;Password=7603835")   带密码
("Data Source=XIAOWEI\SQLEXPRESS;Initial Catalog=StudentSystem;Integrated Security=True")  直接连接本机

 

1、SqlDataAdapter  类   ,以及作用

   这个类代表了 与数据库的链接以及要执行的SQL 命令 ,用它的执行结果用来填充DataSet对象,并且更新一个数据库.     SqlDataAdapter就表示了 数据源 和 DataSet之间进行交互的 桥梁 .     可能说道这里还是比较模糊,不要紧 下面我会给出使用代码    

 

下面是SqlDataAdapter类的几个构造函数 以及用法 ,不管你用何种构造函数 你必须保证SqlDataAdapter类的 SelectCommand 和SqlConnection 属性必须被赋值

 

  Name Description
  SqlDataAdapter() Initializes a new instance of the SqlDataAdapter class.
  SqlDataAdapter(SqlCommand) Initializes a new instance of the SqlDataAdapter class with the specifiedSqlCommand as theSelectCommand property.
  SqlDataAdapter(String, SqlConnection) Initializes a new instance of the SqlDataAdapter class with aSelectCommand and aSqlConnection object.
  SqlDataAdapter(String, String) Initializes a new instance of the SqlDataAdapter class with aSelectCommand and a connection string.

 

 

 

2、SqlCommandBulder    类的作用  

     我们知道  SqlDataAdapter是 DataSet和数据源进行交互的 桥梁 ,就是说我们对 数据源所作的 更改 是通过 SqlDataAdapter这个桥梁反映到  数据源的  

     但是大家可能 只知道 这个桥梁负责  进行数据命令传递,但是 却忽略了  我们在通过桥梁进行 DataSet和 数据源链接的同时 ,  桥梁的作用也是通过 SQL命令实现的

    

  SqlCommandBuilder(SqlDataAdapter)

  这是SqlCommandBuilder的 构造方法  ,需要的参数是一个 SqlDataAdapter类的对象 作为参数  .

     我们只需要在我们的程序中添加如下代码即可 ,记住一定要添加 否则 操作会出错

     Dim   cm  as new  SqlCommandBuilder(参数是SqlDataAdapter类的对象)      //这句话在SqlDataAdapter对象调用 Update方法之前一定要先加上

    创建一个 SqlCommandBuilder类的对象就可以 自动为 SqlDataAdapter类的    UpdateCommand    DeleteCommand  和 InsertCommand进行赋值  

    这三个属性实现的就是桥梁作用的SQL语句

 

 

要记住的一点是 ,一个本地缓存就是 DataSet对象   一个数据表就是 DataTable对象  一个 行就是  DataRow对象  一个列就是 DataColumn对象  可以方便我们理解

简单的使用代码 如下  :

Imports System.Data
Imports System.Data.SqlClient '引入SQL SERVER类型化类名字空间
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Using cn As New SqlConnection
            cn.ConnectionString = "Data Source=XIAOWEI\SQLEXPRESS;Initial Catalog=MyDB;Persist Security Info=True;User ID=sa;Password=7603835"  '数据库链接字符串
            cn.Open()  '在SqlConnection对象构造完毕之后一定要调用 open函数打开数据库  我在写这个程序的时候就忘记了 哈哈
            Dim sql As String = "select *  from info"
            Dim ad As New SqlDataAdapter(sql, cn)  '创建一个 SqlDataAdapter类的对象 作为 DataSet和数据源之间的桥梁
            Dim ds As New DataSet
            ad.Fill(ds)  'SqlDataAdapter 对象调用 Fill 方法 执行 SQL语句并将结果集 填充到 DataSet对象中   并且添加默认映射表 table  
            For Each row As DataRow In ds.Tables(0).Rows  '每个DataSet类中包含的tables属性是一个 DataTable类的集合  DataTable类中的  Rows 和Columns属性分别是 DataRow 类和DataColumn类的集合
                DataList.Items.Add(row(0) + row(1)) '注意在 ADO.NET中表行列索引都是基于 0开始的 在JDBC中是基于1开始的
            Next
            Dim cmd As New SqlCommandBuilder(ad) '创建一个SqlCommandBuilder对象 对数据库的更新 的SQL操作由这个对象自动生成
            '  Dim tem As DataRow = ds.Tables(0).NewRow   '这里的DataRow对象是相对于 数据表而言的 如果我们不调用 DataTble的 NewRow那么所创建的DataRow就跟数据库无关了
            '  tem(0) = "xiaowei"
            '   tem(1) = "new user" '为新的行赋值
            '    ds.Tables(0).Rows.Add(tem)
            '    ad.Update(ds)  '更新本地缓存到数据库

            '    Dim modi As DataRow = ds.Tables(0).Rows(2)  '获得缓存中第一个表的第3行
            ' cmd.GetUpdateCommand()
            '  modi.BeginEdit()
            '  modi(0) = "修改后"
            '   modi(1) = "修改后"
            '   modi.EndEdit()
            '    ad.Update(ds)  '更新本地缓存到数据库 


            '如果表没有定义主键的话那么在更新DataSet的时候就会出现错误,比如说不支持UpdateCommand的命令等等、、、、、

 

        End Using   '在使用完毕 自动关闭和数据库的链接 使用USing 代码段
    End Sub
End Class

 

目录
相关文章
|
5天前
|
存储 缓存 关系型数据库
MySQL数据库缓存query_cache 19
【7月更文挑战第19天】MySQL数据库缓存query_cache
143 73
|
4天前
|
存储 SQL 关系型数据库
数据库事务:确保数据完整性的关键20
【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。
131 70
|
3天前
|
缓存 NoSQL 数据库
在高并发场景下,如何保证Redis缓存和数据库的一致性
在高并发场景下,如何保证Redis缓存和数据库的一致性
|
4天前
|
canal 消息中间件 缓存
面试题:如何解决缓存和数据库的一致性问题?
面试题:如何解决缓存和数据库的一致性问题?
17 1
|
9天前
|
SQL DataWorks 关系型数据库
DataWorks产品使用合集之数据集成时源头提供数据库自定义函数调用返回数据,数据源端是否可以写自定义SQL实现
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
7天前
|
存储 负载均衡 定位技术
现代数据库系统中的数据分片策略与优化
数据分片在现代数据库系统中扮演着关键角色,特别是在面对海量数据和高并发访问的情况下。本文探讨了数据分片的基本概念、常见的分片策略(如水平分片与垂直分片)、以及如何通过优化和选择合适的分片策略来提升数据库系统的性能和可扩展性。
|
9天前
|
数据采集 分布式计算 大数据
MaxCompute产品使用合集之数据集成中进行数据抽取时,是否可以定义使用和源数据库一样的字符集进行抽取
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
11天前
|
Java 关系型数据库 数据库
实时计算 Flink版产品使用问题之如何将增量数据直接写入下游数据库
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5天前
|
消息中间件 缓存 架构师
一个合格的架构师应该怎样处理数据库、调度系统、消息队列、分布式缓存等软件
一个合格的架构师应该怎样处理数据库、调度系统、消息队列、分布式缓存等软件
|
6天前
|
存储 监控 安全
跟数据库交互涉及的敏感数据操作需要有哪些措施
跟数据库交互涉及的敏感数据操作需要有哪些措施