句柄定义了可以用来与数据库进行交互的三种主要对象, 这些对象被称为"句柄"(handle)。
有为数据库驱动设计的驱动器程序句柄(Driver Handle),它是DBI用来创建数据库句柄(Database Handle的句柄,
反过来,数据库句柄又可以创建处理单个数据库命令的语句句柄(Statement Handle),
即语句(Statement).
数据库句柄:
数据库句柄是实际进行数据库操作的第一步,因为它封装了与一个特定数据库的连接。
在数据库中执行SQL语句之前, 必须先实际于数据库进行连接(connect) 可以通过DBI的connect()方法实现:
$dwh = DBI->connect($data_source,....);
在DBI 规范和范例代码中,数据库句柄一般用$dbh.
语句句柄:
语句句柄 是DBI定义的数据库交互和操纵的最后一种对象,它封装了在数据库中执行的SQL语句。
语句句柄是相应的数据库句柄的子类,由于语句句柄是在其权限之内的对象,所以一条语句中的数据不会被其他语句句柄所纂改。
在DBI 规范和例子代码中,语句句柄一般用$sth表示
slave:/root/test# cat a1.pl
use DBI;
$database='zjzc';
$user="root";
$passwd="123456";
$host="192.168.32.6";
$dbh = DBI->connect("dbi:mysql:database=$database;host=$host;port=3306",$user,$passwd) or (die "can't connect to
database ", send_mail('zhaoyangjian@zjcap.cn', "test-database $database is lost"));
print DBI->available_drivers();
print "
";
slave:/root/test# perl a1.pl
DBMExamplePFileGoferProxySQLiteSpongemysql
下面的程序列举了系统中所有的驱动程序以及每一个驱动程序的数据源:
断开连接:
如果已经完成了所有的工作从应用程序中退出,没有必要从数据库中显示地断开连接,
但这是一个好注意。
如果不显示断开连接,将有什么后果呢? 由于DBI句柄指的是Perl对象,Perl的垃圾收集器将来清除
所有的任何无用对象。当程序中没有任何指向这个对象的引用, 或者Perl要退出时,Perl通过调用对象的DESTROY
方法来实现这个清除操作。
默认地,DBI 将通过设置PrintError 属性进行自动错误检查,要去掉这个特性,只要将其值设为0或
通过实例化的句柄也也可,或者,在使用数据库句柄的情况下,使用connect()方法的属性参数。
use DBI;
%attr = (
PrintError => 0,
RaiseError => 0
);
###Connect
#
my $dbName = 'oadb';
my $dbUser = 'system';
my $dbUserPass = 'a2p13mvh';
my $dbh = DBI->connect("dbi:Oracle:$dbName", $dbUser, $dbUserPass) ;
###Re-enable arning-level automatic error reporting....
$dbh->do("create table bb(id int)") or die($DBI::errstr);
$dbh->do("insert into bb values(1)") or die($DBI::errstr);
异常就不执行下面的SQL:
自动错误检查:
DBI 的自动错误检查作用在两个层次上,PrintError
句柄属性告诉DBI 调用Perl 的warn()函数(这个函数常常导致遇到的错误打印在屏幕上)和RasiseError()
句柄属性(这个属性让DBI 针对错误调用Perl的die()函数,一般导致程序立即退出)
1.PrintError => 0 不通过warn() 报告错误
2.RaiseError => 1 通过die 报告
my $dbh = DBI->connect("dbi:Oracle:$dbName", $dbUser, $dbUserPass,
{PrintError => 0 ,
RaiseError =>1}) ;
$dbh->do("create table bb(id int)") or die($DBI::errstr)