PERL DBI

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

手工处理异常的简单例子: 手工处理异常的简单例子:
PS:$DBI::err()方法返回一个由底层数据库生成的错误号;$DBI::errstr()方
法则返回一个由底层数据库生成的错误信息描述.
执行非查询语句
在数据库的常用 DML 语句中,除了 SELECT 语句之外,还有 INSERT, DELETE,UPDATE 三种, 我们统称这三种语句为非查询语句。与查询语句 SELECT 不同,它们只是改变了数据库中的部分纪录,而不会返回一个记录集 给应用程序。所以,相对于查询语句中的 prepare-execute-fetch-deallocate 序 列来说,非查询语句不需要数据抽取阶段,同时也可以将 prepare 和 execute 阶段用一个 do()方法来完成。 my $rows = $dbh->do("INSERT INTO student(sno, sname, ssex,sage,sprof) VALUES ('17', 'james', 'm','38',‘computer')"); 返回值为受影响的行数,如果不知道行数,则返回-1,如果出现错误,则返 回undef。如果受影响的行数为0,则返回值为字符串“0E0”,作为数值它与0等 价,但在判断时它为真。一般用于非SELECT查询,不检索行的语句,如 DELETE、INSERT、REPLACE或UPDATE,主要使用do()。如果对SELECT语 句使用它,则不会获得返回的语句句柄,也不能提取任何行。 对于prepare()的方法可以在调用execute( ) 后,利用语句句柄调用rows( ) 方 法 来返回受影响的行数,通常是查询返回的行数。
数据库句柄( 数据库句wk.baidu.com(Database Handles):
数据库句柄是程序员使用DBI模块和后台 数据库进行通讯的第一步,它包含了一个到 特定数据库的某个独立的连接。
常见数据库的连接字符串: 常见数据库的连接字符串
执行语句句柄( 执行语句句柄(Statement Handles): )
执行语句句柄在DBI规范中被定义为和数据库进行交 互和操作的接口。这些句柄包装了一条条SQL语句,并 将它们交给后台数据库执行。
my @ary_ref = $dbh -> selectcol_arrayref (); 语法解释:执行由$query指定的查询,并通过组合prepare()和execute() 返回结果的第一列。返回结果作为对含有每行第一列的数组的引用。如 果出现错误,则返回undef。
参数绑定
在准备阶段,有一个重要的概念就是数据绑定,与之相关的有三个术语:占 位符(placeholder),参数(parameter)和绑定(binding),他们都是用 来根据程序上下文动态地生成 SQL 语句。将变量放入 SQL 语句的方法有两 种: 第一种使用 Perl 字符串技术动态生成 SQL 执行语句
实现处理完整集。 用fetchall_arrayref( )实现处理完整集。 实现处理完整集
用selectall_arrayref( )实现处理完整集 实现处理完整集
这个方法为您完成了整个prepare( )、execute( )、提取循环、finish( ) 序列。
selectcol_arrayref方法(select家族另外一个成员)
在提取行而不必将值赋给变量时 DBI 也提供一个称为参数约束的输出操作 ,允许通过检索自动进入这些变量的列值使“输出”参数化。
bind_col( ) 的每个调用都应该指定一个列号和一个希望与该列相联的变量的 引用。列号从1开始。bind_col( ) 应该在execute( ) 之后调用。 还有一种选择,就是单独调用bind_col( ),可以在bind_columns( ) 的单个调 用中传递全部变量引用。
处理完整的结果集
在使用提取循环时, DBI 不提供在结果集中随意查找的方法,或以任何次 序而不是以循环返回的次序来处理行。同样,提取行以后,如果没有保存, 前一行会丢失。 这在有的时候不能满足我们的需求。
我们可以用下面的方法来存放完整的结果集: 我们可以用下面的方法来存放完整的结果集:
这里不能使用fetchrow_arrayref( ) ,因为fetchrow_arrayref( ) 重新使用 了引用指向的数组。结果矩阵是一个引用的数组,数组中的每个元素都指 向相同行—最后检索的行。因此,如果想一次提取一行,则要使用 fetchrow_array( ) 而不是fetchrow_arrayref( )。
计算平台
徐杰 2010-10-13
DBI
DBI简介 简介
DBI - Database independent interface for Perl ,也就是perl的数据库独立接口。 为了和数据库进行通讯,Perl 的社区开发出 了统一数据库通讯接口模块:DBI。DBI 作为 Perl 语言中和数据库进行通讯的标准接口,它定 义了一系列的方法,变量和常量,成功地提供一 个和具体数据库平台无关的数据库持久层。
一个简单的例子: 一个简单的例子:
MYSQL
Mysql的安装:yum -y install mysql-server 的安装: 的安装
/sbin/chkconfig --add mysqld 在服务清单中添加mysql服务 /sbin/service mysqld start 服务启动 mysql –uroot –p 进入mysql 新建数据库: 新建数据库:create database test; 进入test数据库:use test; 新建表:create table student( -> sno int(5) NOT NULL, -> sname varchar(15) NOT NULL, -> sage int(11) default‘0’, -> ssex varchar(2) NOT NULL default‘m’, -> sprof varchar(20) -> PRIMARY KEY (sno) -> );
一个通过 DBI 执行的标准简单查询包括 以下四个阶段: 准备阶段(Perpare SQL statement) 执行阶段(Execute select statement) 数据抽取阶段(fetching date) 完成阶段(finishing date fetch)
三种常用的数据抽取方法
my @row = $sth -> fetchrow_array (); 返回包含结果集下一行列值的数组,如果不再有行或者发生错误 ,则fetchrow_array()返回一个空数组。 my @ary_ref = $sth -> fetchrow_arrayref (); 返回一个包括结果集的下一行列值的数组引用。如果不再有行或 者发生错误,则返回undef。 my $hash_ref = $sth -> fetchrow_hashref (); 返回包括结果集的下一行列值的散列引用。如果不再有行或者发 生错误,则返回undef。
第二种方法在 SQL 语句中使用占位符,并且通过 bind_param()方法将 变量与之绑定,生成 SQL 语句。
占位符
DBI允许在查询字符串内部放置一些称为占位符的特殊标记符,然后,在 执行该查询时,将这些值代替那些标识符来使用。这样做的主要原因是提高 性能,特别是在循环中反复执行某个查询的时候。
成功建立student表:
插入数据:
DBI在mysql的具体应用 在 的具体应用
一个简单的DBI脚本 脚本 一个简单的
1 #!usr/bin/perl 2 use DBI; 调用DBI模块 3 use strict; 4 my $dsn=“DBI:mysql:database=test;hostname=localhost”; 数据源 5 my $user_name=“root”; 用户名 6 my $password=“123”; 密码 7 my ($dbh,$sth); 数据库句柄和执行语句句柄 8 my (@ary); 存放查询数据数组 9 $dbh=DBI->connect($dsn,$user_name,$password,{RaiseError=>1});数据库连接 10 $sth=$dbh->prepare(“select * from student ”); 准备执行查询 11 $sth->execute(); 执行查询 12 while(@ary=$sth->fetchrow_array()){ 13 print join("\t",@ary),"\n"; 14 } 提取数据,打印查询结果 15 $sth->finish; 断开执行语句句柄 16 $dbh->disconnect(); 断开数据库连接 17 exit(0); ~
DBI 模块中的三种句柄: 模块中的三种句柄: 在 DBI 模块的定义中,用户可以创建三种 不同类型的句柄。 驱动模块句柄( 驱动模块句柄(Driver Handle):驱动 ) 模块句柄代表一个在内存中加载的驱动,它 在 DBI 模块加载其对应的驱动模块被创建。 它和实际的驱动模块之间是一一对应的关系 。可以通过available_drivers获得可用驱动 的列表。在编程中很少用到这种句柄,因为 我们一般不需要对驱动进行操作。
• DBI模块的体系结构: 模块的体系结构: 模块的体系结构 整个 DBI 模块的结构可以被分成两个主要的部 分:DBI 模块本身和实现与具体数据库平台通讯 的驱动模块。 DBI DBI它就是一个Perl语言的数据库访问应用程 Perl 序的编程接口, DBI 模块定义了提供给 Perl 开发 者使用的编程接口,和对不同数据库驱动模块的 调用方法。而具体的数据库通讯驱动模块的实现 则和特定的数据库平台有关,实际的工作由驱动 器完成,DBI为驱动器在其内工作提供了标准和 框架。
错误处理
在 DBI 模块中提供了两种错误处理的方法。第一种方法依靠程序员手 工检测被调用方法的返回值;第二种方法通过 DBI 模块对错误进行自动 检测,这种方法类似于程序的异常处理机制。对于手工错误处理,可以 通过将“PrintError”和“RaiseError”两个变量设定为 0 来激活。在默认情 况下,“PrintError”参数是被激活的(非0),“RaiseError”参数是被关 闭的。 对于自动错误检测,DBI 提供了两种不同级别的错误处理方法。用于 句柄的“PrintError”参数在被设置为 1 的时候,DBI 模块会调用 warn( )函数进行错误处理。它会将错误信息打印到屏幕,但是并不会中止进 程。而用于句柄的“RaiseError”参数在被设置为 1 的时候,DBI 模块会 调用 die()函数,并且中止进程。 如果想自己检查错误,并显示自己的消息,应该禁用RaiseError 和 P r i n t E r r o r。 PS:如果2个参数都非0,则是按PrintError来处理错误。而PrintError是 默认激活的,所以要激活RaiseError来处理错误要同时设置PrintError为0.
提取单行的结果
第一种方法:不使用循环,我们只调用fetchrow_array( ) 一次。另外,如果我 们只选择一列,甚至不需要将返回值分配给数组。 比如:
第二种方法:另一种期望最多有一个记录的查询是一个含有LIMIT 1来约束返回 的行数的查询 。
第三种方法:获得单个行结果的一种更容易的方法就是使用数据库句柄方法 selectrow_array( ),它结合了prepare( )、execute( ) 并在单个调用中提取行 。
• DBI应用程序的架构 : 应用程序的架构
API是应用程序Perl-脚本(编程)接口。调用接口和变量由DBI提供到 perl脚本。 ‘Switch’是用来为实际的执行调度DBI方法调用到恰当的驱动器的一段 代码。Switch还负责动态加载驱动器,错误检查/处理以及其他职责。 驱动器负责实施支持给定类型的数据库。驱动器包含使用相应引擎的私 有接口函数编写的DBI方法的实现。
相关文档
最新文档