集算器中数据库连接的控制

在处理数据库事务时,有的操作有可能会产生错误,而错误的产生有可能会带来不可预知的操作结果,尤其是在批量事务中。为了避免这种情况的产生,就需要对数据连接进行相应的控制,并对数据库事务中的错误信息进行相应的处理。

 1、数据库错误信息

下面我们先来研究数据库的错误信息。在这里,用一个Access文件DbCon.accdb作为目标数据库,在集算器中,新建一个ODBC数据源,直接使用这个文件中的数据,连接串填入:DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=D:\\files\\DbCon.accdb:

Access文件DbCon.accdb中,建立了空表CityBak:

其中ID为主键,特别的,POPULATION要求其中的数据>1000000。

现在,准备将demo数据库中,CITIES中的数据,填入CityBak表中:

A1从demo数据库中,取出CITIES表中的数据:

A2连接DbCon数据库。A3中,取出CityBak表中的数据,由于是新建的表,里面原本没有记录:

当执行到A4时,就出现了错误,这是由于限定了POPULATION>1000000,当试图填入第10条记录Detroit的信息时,不符合要求。在默认情况下,在数据库运算出现错误时,会中断执行。

在这个时候,我们可以在另一个dfx中,查询数据的填写情况:

A2中的查询结果如下:

可以看到,虽然由于CityBak表中对数据的限制,致使第1个网格中的程序未能执行成功,但是仍然有部分数据被填入了目标表中。

在批量更新数据库时,一旦出现数据库错误,就会终止程序的运行。为了避免这样的情况,我们可以在产生连接时,使用@e选项,用代码来自行处理数据库错误,而不中断。如:

在A2中,生成数据库连接时使用了@e选项,这样在出错时将可以由代码自行处理,而不会中断程序。为了保持与前面的一致,先在A2中将CityBak表中已有的记录清空。运行后,A5中查询到的结果和前面是一致的:

在A4执行更新CityBak表中数据时,由于在更新数据时出现了不符合数据要求的操作,因此可以在B4中看到错误代码:

说明,在批量更新中,一旦出现数据库错误,就会中断更新数据库,同时记录错误。我们也可以将A4中的表达式修改为[email protected](),此时可以查看到错误信息:

我们继续探索:

[email protected]()中使用@a选项,可以在执行更新前将数据库表中的数据先清除,就不必再添加语句去删除记录。在A3中,仅取出前5条记录,填入CityBak中,此时记录均满足数据要求,A3中的语句执行正常,因此在B3中的错误代码为0:

而从A5中也可以看到,记录存入正常:

    2、控制提交与回滚

我们无法提前知道批量更新的记录是否全部能成功,也无法知道哪一条记录会产生错误。在默认情况下,每条记录的更新结果都会自动提交,就使结果变得不可预知了,这对于数据库管理可不是一个好现象。

在处理数据库事务时,有时候需要根据情况,来决定是将改动提交到数据库,还是取消操作,这个时候,就需要使用db.commit()db.rollback()来进行控制。

在默认情况下,在集算器中执行语句都是自动提交的,此时是无法自行控制的。如果想用db.commit()db.rollback()来进行控制,需要在执行语句时使用@k选项,用代码控制提交。这样,就可以根据错误信息,来决定数据是否有效了。如下面的例子,在批量执行更新时,如果产生错误,则所有数据全部无效,这样就可以避免数据库中出现不可预知的结果:

A3中,将CityBak中的数据清空,由于在执行db.execute()时未使用@k选项,因此会自动进行提交。

A4中,执行批量更新时,会产生错误,这可以从A5的运算结果中看到:

因此会执行B6中的回滚操作,数据不会写入数据库。A7中的查询结果如下:

使用@k选项进行批量更新时,如果未产生错误,如A8中执行的语句,也可以根据错误代码判断,A9中值为:

此时会执行B9中的提交操作,数据写入数据库。A11中的查询结果如下:

时间: 2024-10-07 01:39:30

集算器中数据库连接的控制的相关文章

润乾集算报表的集算器数据集部署(I)

润乾集算报表提供了集算器数据集,允许用户使用集算器脚本完成数据的进一步计算和加工,为报表提供数据源支持,从而简化报表开发,提升报表性能. 集算器脚本的编辑需要借助第三方集算编辑器(非报表工具)完成,而后嵌入到报表工具和报表应用中完成报表开发和部署. 下面来看一下集算器数据集的使用和以及报表部署过程. 1.开发环境使用 集算报表使用集算器数据集时,首先需要设置集算器授权信息和配置数据源连接(如果需要从数据库中取数). 1.1.设置授权信息 启动集算报表设计器,选择工具-选项,切换到"集算器选项&q

集算器简化SQL式计算之组内运算

在开发数据库应用时,经常会遇到分组后针对组内数据的运算问题,如:列出近3年每年都发表过论文的学生名单,统计全部参加了历次培训的员工,选出每位客户的高尔夫成绩最高的三天等等.SQL完成这类运算较为复杂,一般需要嵌套多层,导致代码难以理解和维护.而集算器擅长表达这类组内计算,且很容易和JAVA或报表工具集成.下面用一个例子来说明. 根据数据库表SaleData统计出2013年中,每个月销售金额均排在前20名的客户名称.SalesData的部分数据如下: 想解决这个问题,需要选出2013年的销售数据,

集算器调用数据库存储过程的代码示例

集算器可以方便的调用数据库的存储过程,这里通过例子来看一下具体的程序写法. 调用无返回值的存储过程 用oracle的存储过程为例,存储过程只有一个输入参数,没有输出参数: create orreplace procedure pro1 (pid IN VARCHAR) as begin insert into emp values(pid,'mike'); update emp set name='rose' where id=pid; commit; end; 在集算器中可以使用execute

用集算器实现报表的外置存储过程数据源效果

业务逻辑相对复杂的报表开发中,开发人员往往会使用存储过程为报表准备数据.而使用存储过程往往受到编写困难.执行效率低下.数据库操作权限限制等问题,着实让开发人员不爽.如何改进或替代存储过程,成了很多程序员的心心声. 本文通过一个例子说明如何使用集算器实现报表存储过程数据源效果. 报表样式 某网络平台需要监测查看一定周期内的用户状况,需要为运营部门出具日报.周报.月报.年报等报表,每类报表中均包含本期与上期.上上期数据比较,故涉及数据量较大.这里以其日报为例(月报年报只是统计周期不同),报表格式如下

集算器协助java处理结构化文本之数据读入

JAVA只提供了指定分割符等最基本的数据读入功能,而其他常见功能都需要自己从底层去实现,比如:按列名读入指定列.指定列的次序.指定数据类型.无分割符等等.JAVA实现这类功能虽然不难,但代码很繁琐,很容易出错. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件data.txt是tab分割的文本文件,有30个列,第一行是具有业务意义的列名,现在需要按列名读入这几列:ID.x1Shift.x2Shift.radio,并按业务公式“((x1Sh

集算器是什么?

集算器是一种程序设计语言,专注于(半)结构化数据计算与处理,提供了丰富的此类运算的类库.集算器不是面向对象的程序设计语言,没有复杂的继承和重载概念,引入对象概念仅仅是为了更方便地描述与对象相关的方法,有BASIC这类初级程序设计水平的程序员都能很快掌握.集算器是基于Java解释执行的动态语言,可以在运行过程中拼出代码执行,这样可以获得更大的灵活性,进一步降低程序设计的复杂度. 集算器定位为(半)结构化数据处理,没有直接提供统计分析.数据挖掘和机器学习等算法,也不擅长处理媒体和地图类数据. 与Ja

集算器程序之序列与序表(1)

序列.序表.排列是集算器中最常用的数据类型,本文将阐明它们之间的关系和各自的特性. 1.序列是有序的泛型集合 1.1集合性 序列由多个数据构成, 这些数据被称为序列的成员, 成员可以是任意数据类型,比如字符串.数字.浮点.日期,序列成员还可以为空.序列具有集合的一般特性,可以进行集合运算.如: 上面网格中,A1,A2和A3中的值如下: 它们都是序列,其中,A1中为空序列:A2序列中的成员都是整数,也称作数列:A3的值是成员为字符串的序列. A4中用表达式计算序列,和A3中的常数序列不同,表达式中

集算器实现报表中零散的不规则计算

报表中存在的不规则计算往往给报表开发带来很大的困难,使用报表工具往往很难甚至无法直接实现.这里的不规则计算是指报表中存在特殊条件的统计项(计算),如:销售订单金额统计中计算前5名销售金额的合计和占比:学生成绩统计中总成绩排名前10的学生中语数外都超过90分的人数:用户充值统计中充值金额超过充值总额一半的用户数量等. 通过集算器可以很方便完成这类报表的开发,我们通过两个例子来了解一下具体的做法. 1.实例一 1.1 .报表描述 根据员工与订单表统计各销售人员的销售情况,并在报表中计算列出订单总额.

集算器管理数据库事务的代码示例

集算器可以向数据库写入数据,支持数据库事务管理.这里通过例子来看一下控制事务提交和回滚等等的编程方法. 1.自动提交事务 集算器可以方便的实现增删改,最简单的写法如下: 上图中的A2到A4分别实现了插入.修改和删除.每条sql执行之后自动提交.需要说明的是: 1.3条语句提交了3次,对数据库操作比较频繁. 2.三条sql没有事务关系,后续的sql如果执行失败,并不影响前面的sql. 下面介绍结合序表批量提交事务,以及多条sql组成一个事务的编程例子.     2.批量提交事务 从students