在LOTUS NOTES 中通过ODBC访问关系数据库的方法

摘  要  本文基于MicroSoft的开放数据库互连技术,介绍了Lotus Notes中激活ODBC的基本方法并给出了一个将关系型数据库信息转换到NOTES数据库的实例。
   关键词  ODBC、DBMS、@DB、ODBCConnection、ODBCQuery 、ODBCResultSet

1        引言
    自从1989年12月6日,莲花发展公司(LOTUS  DEVELOPMENT CORP .)发表了Lotus Notes,一种能极大改进公司内部、与其他公司及客户之间的环球通讯、协同工作和协调一致的软件产品。由于它有很好的电子邮件系统,领先的全文检索和复制功能,还具有极强的安全措施,可以可靠地保证安全性,因而得到广泛的应用
但它也有自身的弱点,在联机事物处理问题,比如:数据统计、分析、图表生成等功能上还很弱,这时就需要传统的关系型数据库管理系统来实现。如何把现有的关系型数据库信息转换到Notes数据库中,以便利用Lotus  Notes中的许多良好性能共享数据库,是本文要讨论的问题。

2        ODBC概述
    ODBC(OPEN  DATABASE  CONNECTIVITY  开放数据库连接)是微软开放的服务结构(WOSA:MicroSoft  Windows   Open  Service  Architechtrue)中有关数据库的一个组成部分,它规定“以统一的API存取异构数据库信息”是对SQL  ACCESS  GROUP的CLI标准的一种实现,得到了世界上领先的数据库和应用程序开发商的广泛支持。通过使用这统一的API建立的应用程序,对数据库的操作不依赖于任何数据库管理系统,不直接与任何DBMS(数据库管理系统)打交道,从而直接实现应用程序对不同DBMS的共享。
采用ODBC技术,应用程序只需关心数据的处理而不必考虑数据的存取,编程人员不必了解具体的DBMS,从而极大地减少了软件开发人员的工作量,缩短了开发周期,提高了效率和软件的可靠性。

3 ODBC工作原理
     ODBC接口以SQL作为标准的查询语言来存取连接到的数据源。ODBC允许单个应用存取多个不同的数据库管理系统,这使得应用开发者可以开发、编辑和发行应用而不管它操作的数据库管理系统(DBMS)究竟是什么。用户可以通过加载连接到不同数据库的驱动程序来建立与各种数据库的连接。
  一般说来,ODBC调用由四个层次组成:
3.1          第一层为ODBC应用软件,它通过调用ODBC函数给数据库发送SQL语句并处理SQL返回结果。LOTUS  NOTES 是通过NDODBC完成这一功能的。
3.2          第二层为驱动管理软件。驱动管理器管理驱动程序和装载驱动程序,它的作用如下:
●        用ODBC.INI文件映射数据源名到特定的驱动程序;
●        处理几个ODBC初始化调用;
●        给每个驱动程序提供ODBC函数入口点;
●        对ODBC的调用参数和顺序进行检验。
3.3          第三层为驱动软件。处理ODBC函数调用,提交SQL请求到特定的数据源并返回结果给应用。如果必要,它会修改应用的SQL请求,以使SQL请求的写法与物定数据库的语法一致。
3.4          第四层是数据源。数据源是指要存取的数据及相关的操作系统、数据库管理系统和网络系统。
4         ODBC接口支持的SQL语句
   事实上,ODBC驱动(第三层)程序有两类,一类含有SQL语句处理功,另外一类则没有。
     因此,我们可以看到,对不含SQL处理功能的ODBC驱动来说(如SYBASE的ODBC驱动),应用中可以使用的SQL语句就是数据源数据库(如 SYBASE)支持的SQL语句,那么,含有SQL处理功能的ODBC驱动(如dBASE的ODBC驱动)支持哪些SQL呢?
     这类ODBC驱动有两部分内容,一类是处理所支持ODBC函数调用的应用程序接口(如API、 APPLICATION  PROGRAM  INTERFACE),另一类是处理所支持SQL语句及SQL数据类型的SQL处理程序(SQL  GRAMMER)。API按其功能大小分为三级:
4.1第一级(Core):含有X/OPEN和SAG CLI规定的API函数集合。
4.2第二级(Level  1):含有第一级的所有API函数,并且还有一些扩展函数。
4.3第三级(Level  2):含有第一级和第二级的所有API函数,并且还再有一些扩展函数。
LotusNotes 4.5版本要求ODBC驱动的API至少支持到第二级。

5         建立ODBC数据源
    Lotus  Notes使用ODBC标准存取异种数据库信息。通过Notes里内嵌的公式或Script语言,您可以在Notes文档中引入非Notes信息,可把现成的数据转换成Notes数据库。在存取外部数据之前,您必须先定义一个数据源,以便让ODBC 驱动程序管理器知道怎样获取数据。一个数据源把一个特定的ODBC驱动程序和要存取的数据库联系在一起,并包括您想存取的数据,它与服务器或目录、后台DBMS(数据库管理系统)以及网络平台相联系,这些信息都记录在一个注册文件中(在Windows95中是ODBC.INI),可采用Windows的管理工具注册数据源。ODBC驱动程序管理器负责将应用程序的SQL语句以及其他的信息传递给驱动程序;而驱动程序则负责将结果集传回应用程序。在WINDOWS95中的操作步骤如下:
①        打开WINDOWS控制面板;②按下ODBC图标;③按下ADD按钮;④选择您需要的驱动程序,按下OK按钮;⑤输入数据源名称、描述信息,以及所需要的信息;⑥有些驱动程序还需要其他的一些信息,输入这些必要的信息,并按下OK按钮;⑦按下CLOSE按钮。

6        使用函数通过ODBC访问异种数据库
   在LOTUS NOTES 4.5版本中提供了三个函数访问异种数据库,并返回一个值或列表值:
      ●@DBCOLUMN(ODBC)返回表格中一列的全部数组,或者全部不同的数值;
      ●@DBLOOKUP(ODBC)返回在表格中一列通过匹配关键字选定的数值;
      ●@DBCOMMAND(ODBC)传递一个命令到外部DBMS并返回结果;
     其中@DBCOLUMN、@DBLOOKUP都只能提取数据,它们不能增加、删除、修改数据,或执行其他操作;@DBCOMMAND能恢复数据或发送其他可以改变数据的SQL语句;
    下面给出它们的标准形式:
       @DbColumn(“ODBC”:”NoCache”;data_source;user_ID1:user_ID2;pass_word1;password2;table;column:null_handling;”Distinct”:sort)
       @DbLookup(“ODBC”:”NoCache”;”data_source”;”user_ID1”:”user_ID2”;”password1”;”password2”;”table”;”column”:”null_handling”;”key_column”:”key”;”Distinct”:sort)
       @DbCommand(“ODBC”:”NoCache”;data_source;user_ID1:user_ID2;pas_sword1;password2;command_string:null_handling)
     注意:如果用户的NOTES。INI文件有下列语句:
             NoExternalAPP=1
则所有公式被禁止,并且看不到任何错误信息,公式不能执行。
7        通过ODBC使用LotusScript访问外部数据库
LSX兼容模块允许您使用LotusScript语言来编写存取外部数据的程序,Notes的ODBCConnection、ODBCQuery、ODBCResultSet三个类为Notes提供了用ODBC标准存取外部数据库的属性和操作。
记住,您必须把下面的语句放置在(GLOBAL)对象的(OPTIONS)事件中才能访问ODBC类:
            USELSX“*LSXODBC”
●        ODBCCONNECTION类  代表了与数据源连接的ODBC  DATA  ACCESS特性;
●        ODBCQUERY类  代表定义一个SQL语句的ODBC数据库存取特性,一个查询在被使用或者有效确认之前,必须从属与一个有效的连接
●        ODBCRESULTSET类  代表在集合上执行操作的ODBC数据存取特性

8  由关系型数据库转换成NOTES数据库的一种实现方法
    下面以Notes访问Foxpro数据库为例,介绍Notes访问异种数据库的一种实现方法。
    基本编程思路是:对Foxpro的一个数据库,按其基本结构相应在Notes数据库里建立一个同样结构的表单,以便把Foxpro某个字段的信息经转换后存在Notes表单相应字段中,建立一个操作,用Lotus Notes语言编写转换程序,在视图中运行,以实现外部数据库信息向Notes数据库转换。
假定Foxpro的一个数据库(SU97.DBF),其结构如下:
         
             字段名       类型        宽度
          orDINAL       N            4
          COMTIME       D            8
          COMWORD       C           18
          COMNO         C            3
          RECETIME      D            8
          RECEWORD      C           18
          RECENO        C            3
          RECEDEPA      C           24
          RECETITL      C          120
          SECLEV        C            4
           HANDLE       C           12
          THEME         C           48
          REMARK        C           60
          TODEPA        C           40
          ENDDEPA       C           40
欲将此数据库所有信息转换到NOTES库中,实现步骤如下:
8.1在NOTES中新建一个数据库,取名为ODBC.NSF,在这个数据库里创建一个表单,取名为TEST_ODBC,其内容如下:
            域  名             类 型         说  明
            XUHAO              数 字        可 编 辑
        SHOUWENSHIJIAN         时 间        可 编 辑
          SHOUWEIZI            文 本        可 编 辑
          SHOUWENHAO           文 本        可 编 辑
        LAIWENSHIJIAN          时 间        可 编 辑
           LAIWENZI            文 本        可 编 辑
          LAIWENHAO            文 本        可 编 辑
         LAIWENJIGUAN          文 本        可 编 辑
         LAIWENBIAOTI          文 本        可 编 辑
              MIJI             文 本        可 编 辑
         BANFUQINGKUAN         文 本        可 编 辑
           ZHUTICI             文 本        可 编 辑
         SONGBANDANWEI         文 本        可 编 辑
        WANCHENGDANWEI         文 本        可 编 辑

在ODBC.NSF数据库中建立一个标准视图,取名为TESTVIEW,定义该视图选项为Select (form=”test_odbc”);同时创建一个操作,标题为“转换”,在CLICK事件中作如下编程:
Sub Click(Source As Button)
     Dim session As New notessession
     Dim db As notesdatabase
     Dim doc As notesdocument
     Dim view As notesview
     Dim r As Integer
     Dim con As New odbcconnection
     Dim qry As New odbcquery
     Dim result As New odbcresultset
     Set db=session.currentdatabase
     Set view=db.getview("testview")
     If con.connectto("Foxpro25") Then
          Set qry.connection  =  con
           ,发出查询请求
          qry.sql="select *from su97"
          Set result.query = qry
          If Not result.execute() Then
               Messagebox("error:" &_
               result.geterrormessage(db_lasterror))         
          End If
          columns=result.numcolumns
          Do
               Call result.nextrow()               
               Set doc= New notesdocument(db)   
                Doc.form=“test_odbc”
               ,取出结果集并存入相应字段中           
               doc.xuhao=result.getvalue(1)
               doc.shouwenshijian=result.getvalue(2)         
               doc.shouwenzi=result.getvalue(3)
               doc.shouwenhao=result.getvalue(4)
               doc.laiwenshijian=result.getvalue(5)
               doc.laiwenzi=result.getvalue(6)
               doc.laiwenhao=result.getvalue(7)
               doc.laiwenjiguan=result.getvalue(8)
               doc.laiwenbiaoti=result.getvalue(9)
               doc.miji=result.getvalue(10)
               doc.banfuqingkuan=result.getvalue(11)
               doc.zhutici=result.getvalue(12)
               doc.beizhu=result.getvalue(13)
               doc.songbandanwei=result.getvalue(14)
               doc.wanchengdanwei=result.getvalue(15)
               Call doc.save(True,False)  
          Loop Until result.isendofdata
           ,与数据库断开联系
          Call con.disconnect()         
     Else
          Messagebox("could  not  connect  to  server")
     End If
End Sub
8.2在视图中点击“转换”按钮,就可以将FOXPRO中数据库(SU97。DBF)的信息一次转换到NOTES数据库了。

以上方法已在机器上调试通过。
原文地址:https://www.cnblogs.com/hannover/p/1347903.html