Username: Password:

PERL怎样利用WIN32ODBC插件和数据库结合
来源:linux宝库作者:linux宝库 发布时间:2007-09-30 00:00:00


  Perl 以前多数应用在Unix平台上,但最近随着微软在Internet方面的重视和投入,NT在Internet方面也占有了一席之地。相当一部分编程人员也从Unix平台转向 NT平台,Perl程式的移植很容易做到,唯一需要注意的是:在 Unix下连接数据库时,和具体连接的数据库接入格式和相应的扩展程式有关,而且各不相同,如:和Oracle连接采用Perl-Oracle沟通界面? oraperl/DBI Extension;而在Win NT/95下,连接数据库时,则多数采用统一的格式和标准?ODBC(开放式数据库连接)server和我们这里提到的ODBC插件(For Perl)。

  和其他CGI编写语言(VBScript、JavaScript-for server、C Shell、C/C++...)相比,Perl具备以下5个长处:

  1 具备高度可扩展性和随时可用。(ODBC.pm就是其中的一个插件)

  2 具备很强大的字串处理功能。

  3 很容易调用系统命令(shell commands),易于编写Unix系统程式。

  4 具备面向对象的编程能力,代码的可维护性、复用性好。

  5 适用于各类Web服务器(如:Unix、NT、Netscape),具备良好的通用性。

  由于具备以上的长处,Perl理所当然地成为了编写CGI中最热门的语言。

  一 Perl简介

  Perl原来主要用于编写一些Unix系统上的管理和监控程式,由于Perl和Unix系统紧密相连,故后来很多人都喜欢采用Perl来编写 CGI 程式。现在相当一部分企业都会采用NT平台,但大部分仍然采用Perl进行应用研发。因为他具备良好的通用性和强大的字处理能力,即使以后改用Unix系统(可能由于接入用户数增多,访问量加大),程式修改量也不大(VBScript则无法移植,VBScript Windows only),故能够相信无论以后Internet server (包括Web server)的主导是NT(IIS)还是Unix(NCSA、apache...),Perl都会是炙手可热的CGI编写语言。

  1 CGI基本原理

  client<--->Web server<--->CGI<--->DataBase/Server File/Server Environment

  当某些Web页面能够产生动态文档,让您填入表格,显示出色动画,或是收发大型数据库信息,读取和配置各类服务器/路由器环境变量和状态,八成是利用公共网关界面,也就是所谓的 CGI(Common Gateway Interface)。

  CGI本身不是一种程式语言,而是Web server和DataBase Server/其他Server之间交互作用的机制。利用CGI,软件工程师得以让Web页面可直接读取和配置各类服务器/路由器、检索各类大型数据库等。

  2 使IIS(Microsoft Web Server,NT自带)支持Perl程式当您在NT上装好Perl编译程式后,需进行以下几项的配置,IIS才会支持Perl程式的调用。

  1) 运行Regedt32.exe 注册表编辑器 (假如不知在哪里,可用search找)

  2) 打开下面的目录(准备添加信息进该目录)

  HKEY_local_machineSystemCurrentControlSetServicesW3SVCParametersScriptMap

  3) 在EDIT菜单下选择‘添加数值’选项

  4) ’数值名称’填 .pl

  5)‘数值类型’填REG_SZ

  6) 按确定后,再填写‘字符串’

  ‘字符串’= c:perl5binperl.exe %s%s

  (假如您的perl.exe文档不是位于该目录,只要填上相应路径即可。)

  7) 重新起动Web Server

  3 ODBC插件的安装

  ODBC插件是电脑爱好者用V C++ 2.0编写的一个Perl for Win32的部件,相当于我们用C++编写程式时使用的类,只要定义一个属于该类的对象,就可调用他的属性和method。Perl for Win32的部件很多都是电脑爱好者编写的,使用也是免费的,如同Linix的建设相同。假如您编出一些好的部件,也可在网上公开,让更多的朋友和您分享。下面我将简单介绍一下ODBC插件的安装步骤和注意事项。

  注意事项:

  1)ODBC插件的版本要比Perl的版本高,也就是说ODBC插件的出版日期要迟于Perl的出版日期。建议采用ODBC插件的最新版 Win32odbc_v970208(97年2月28日出版),5.001版的Perl--110-i86(96年8月13日出版);很多人经常会装上最新版的Perl 5.003系列(97年6/7/8/9月出版),结果运行ODBC调用的程式时,就会出现以下的错误信息:’Error:Parse exception’.假如不了解情况,这确实让人很困惑不解。

  2)110-i86.zip是个zip文档,但是download后,系统会默认为exe文档,您要把文档后缀名改为zip。

  3)假如您仅想在DOS下运行程式,只需在‘我的电脑’中添加上该类型(.pl)即可。假如您想在Web上调用Perl程式,则必须在Web Server的注册表上登记,不同的Web Server上注册的方式将有少许不同,有关IIS的登记上面已作介绍。

  4)假如您运行ODBC调用的程式时,出现以下的错误信息:’can’t locate win32/odbc.pm in @INC ...’。这通常是您的ODBC插件没有装好,应该首先检查odbc.pm和odbc.pll是否已拷贝到相应的目录上。(后面有介绍)

  5)假如需要以上的软件和帮助,可到响应的站点上查找。下面列出部分网址供大家参考。

  http://202.96.151.200/zyr/

  http://www.perl.hip.com/

  http://www.roth.net/odbc/

  ftp://ftp.linux.activeState.com/pub/Perl-Win32/

  安装步骤:

  1)先解开Win32odbc_v970208.zip文档,存在某个目录下。

  2) 拷贝文档 libwin32odbc.pm 到 perl5libwin32 (假如您的Perl目录不是这样,作相应修改即可。)

  3)在perl5libautowin32 目录下创立odbc目录。

  4)拷贝文档 libautowin32odbcodbc.pll到perl5libautowin32odbcodbc.pll

  4 Perl 5.0的某些语法

  连接数据库后,对数据进行处理时,我们将会用到Perl 5.0的一些语句。在这里先介绍一些基础知识,对后面内容的理解将很有帮助。

  1)变量(对象)的表示方法:前面以$打头,如:$db,$bcd

  2)普通阵列的表示方法:前面以@打头,如:@value

  读取方式:$value[0],$value[1]...

  3)相关阵列的表示方法:前面以%打头,如:%value。相关阵列和普通阵列没有什么不同,差别只在他的索引值是用字串,而非一般常用的整数值。

  读取方式:$value{$string1},$value{$string2}...

  二 用Perl通过ODBC创建数据库应用程式

  利用ODBC类,能够十分方便地实现Web server和数据库的动态连接,在Internet/Intranet上研发出client/server结构的数据库应用程式。

  1 数据库访问结构图

  client<->Web Server<->CGI(perl,odbc插件)<->odbc server<->各类数据库

  2 ODBC插件的数据库命令

  (1)使用ODBC类

  use Win32:ODBC;

  当要使用ODBC类时,必须在您的程式里加入上这一行。

  (2)创建ODBC的对象

  $db=new Win32::ODBC("MYDSN");

  接着我们要定义一个新的ODBC类的对象,这个对象和要连接的数据库的别名是相关联的;即在MYDSN处填上要连接的数据库在ODBC server(安装后放在控制面板里)中配置的别名。假如要访问的数据库需提供用户名和密码,可改用下面的格式:

  $db=new Win32::ODBC("DSN=aa;UID=bb;PWD=cc;");

  (其中aa填别名,bb填用户名,cc填密码)

  假如您连接的是Access数据库,可采用第一种方法,因为在ODBC Server中连接Access数据库时可配置用户名和密码;假如您连接的是SQL数据库,只能采用第二种方法,因为在ODBC Server中连接SQL数据库时不能配置用户名和密码。

  (3)连接数据库

  $db->Connection;

  连接成功时返回true,否则返回false。

  (4)断开数据库连接

  $db->Close();

  (5)执行命令

  $db->sql("sql command");

  sql command 为一有效的sql语句表达式

  (6)读取新一行的数据(操作对象为刚执行完sql语句后的结果)到缓冲区

  $db->FetchRow();

  和其他语言中的游标往下移一行同效,当刚执行完sql语句后,再执行上述语句,相当于读取第一条记录数据。

  (7)把数据从缓冲区存放到变量中

  ($a,$b)=$db->Data("f1","f2");

  ($a、$b为变量,f1、f2为字段名)

  (8)把数据从缓冲区存放到普通阵列中

  @values=$db->Data;

  (把字段值依此放入@values中)

  (9)把数据从缓冲区存放到相关阵列中

  %hash=db->DataHash;

  (字段值可用$hash{字段名} 读取)

  关于ODBC类的方法详见下表:

  方法 功能 参数 备注

  Catalog() 读出table信息前的配置 qualifier,owner,name,type 和TableList()连用

  Connection() 连接数据库 无

  Close() 关闭数据库连接 无

  Data() 取数据 字段名/无

  DataHash() 取数据到相关阵列 字段名/无

  DataSources() 取被连接数据库的别名及相关描述 无

  Drivers() 取ODBC Server的名字及相关属性 无

  DumpError() 显现最后的出错环境 无 debug用

  DumpData() 显现任何字段名和数据 无 debug用

  Error() 显现最后的相关出错信息 无 debug用

  FetchRow() 读取新一行的数据 无

  FieldNames() 读取字段名 无

  GetConnections 读取任何对象的连接状态 无

  GetDSN() 读取连接时所用的字串 无

  GetStmtCloseType() 读取当前数据库关闭类型的配置 无

  GetMaxBufSize() 读取单个字段的最大字节数 无

  MoreResults() 判断是否更有下一个记录 无

  new() 创立新的对象 类的名称

  RowCount() 返回记录数 无

  Run() 运行sql语句 sql语句

  SetMaxBufSize() 配置单个字段的最大字节数 变量/整数(<2G)

  SetStmtCloseType() 配置当前数据库关闭类型 SQL_CLOSE/SQL_DROP/ SQL_UNBIND/SQL_RESET_PARAMS

  Shutdown() 关闭ODBC连接 无 debug

  Sql() 执行sql语句 sql语句

  TableList() 读出table的信息 无

  三 Perl通过ODBC研发数据库应用实例

  下面,我们将以一个实例来介绍怎样用Perl编写一个网址查询系统。有关环境配置如下:操作系统是Windows NT Server 4.0,数据库平台为

  SQL 6.5,Web Server 为IIS 2.0,ODBC Server 为ODBC 2.5,perl 的版本为5.001,odbc插件的版本为970208。

  1 数据库结构 首先,假设已存在一个名叫lookup的table供我们查询使用。他放在pub(database)中,用username="sa"、passwd=""能够访问,结构如下:

  段名 属性 功能

  title char(40) 网页的名称

  url char(40) 网页地址

  descr char(240) 网页描述信息

  2 输入查询关键字(search.html)

  

  

  search.html

  

  

  


  

  


  

  

  注释:10.240.9.30为的Web Site地址

  3 查询及返回结果(se.pl)

  #header

  print "HTTP/1.0 200 OKn";

  print "Content-Type:text/htmlnn";

  #body

  use Win32::ODBC;

  if (!($O= new Win32::ODBC("DSN=sql6;UID=sa;PWD=;"))){

  print "Failure connection nn";

  exit();

  }

  $O->Connection;

  $String=$ENV{’QUERY_STRING’};

  ($Name,$Key)=split(/=/,$String);

  # $key存放着查询关键字

  $s_sql=join("","select * from lookup where title like’%",

  $key,"%’");

  $O->Sql($s_sql);

  print "n";

  print "n";

  print "se.pln";

  print "n";

  print "n";

  print "n";

  while($O->FetchRow()){

  %hash=$O->DataHash;

  print "

  n";

  }

  $O->Close();

  print "
$hash{title}$hash{descr}
n";

  print "n";

  print "n";

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅