利用ODBC实现Domino和关系数据库的互操作

Lotus Domino是当今办公自动化系统的主流开发平台之一,Domino自带一个非关系型数据库–文档型数据库,而目前大部分企业的信息都储存在诸如SQL Server等关系型数据库中,因此,在开发办公自动化系统过程中势必要涉及Domino和关系数据库的数据交换问题。


一、Lotus Domino与关系数据库的互操作

在Lotus Domino R5中提供了三个Lotus Notes扩展类:ODBCConnection(ODBC连接)、ODBCQuery(ODBC查询)以及ODBCResultSet(ODBC结果集)。应用这三个类并辅以Lotus Script语言就能实现与关系数据库的互操作问题。


具体解决方法如下:

第1步:在控制面板→32位ODBC数据源中建立用户数据源Test;

第2步:在Domino R5中新建一个数据库Try,并建立一个空白表单Con-nection,此表单没有任何内容,然后在表单上创建一个”操作”,起名为”Read”;


第3步:在”Read”操作的编程窗口中选择编程语言为Lotus Script;

第4步:在编程窗口的对象窗口中点击”Option”事件,并写入如下脚本:

Uselsx “lsxodbc” // 使用Lotus Script 扩展ODBC类

第5步:选中”Declare”事件,在其中写入:

Dim session As NotesSession

Dim db As NotesDataBase

Dim doc As NotesDocument

Dim qry As ODBCQuery

Dim result As ODBCResultSet

Dim con As ODBCConnection

第6步:选中”Click”事件,在其中写入:

Sub Click(Source As Button)

′ Set New Value

Set session=New NotesSession

Set con=New ODBCConnection

Set qry=New ODBCQuery

Set result=New ODBCResultSet

′ Get Current Database

Set db=session.CurrentDataBase

Set doc=New NotesDocument(db)

doc.form=”connection”

Call con.Disconnect()

If con.ConnectTo(“test”) Then

Set qry.connection=con

qry.SQL=”SELECT  FROM Table1″

Set result.Query=qry

Call result.Execute()

columns=result.Columns

Do

Call result.NextRow()

For i=1 To result.Numcolumns

field=result.FieldName(i)

value=result.GetValue(field)

If Isdate(value) Then

If value=Datevalue(“0:00:00″) Then

value=” ”

Else

value=Format(value,”mm-dd-yyyy”)

End If

End If

Set item=doc.AppendItemValue(field,val-ue)

Next

Call doc.save(True,True)

Set db=session.CurrentDataBase

Set doc=New NotesDocument(db)

doc.form=”test”

Loop Until result.IsEndOfData

Call con.Disconnect()

Else

Messagebox(“Could not connect to server”)

End If

End Sub

最后,保存表单并运行,用鼠标点击Read操作后,关系数据库中的内容就被取到Notes的文档型数据库中了。

二、程序存在的问题及解决

但是使用上面的代码在进行实际数据库内容转换的时候,我们发现Notes 通过ODBC数据源连接关系数据库时,无法识别中文字段名。如果关系数据库的字段是中文名字,那么ODBCResultSet将为空,解决的办法是将关系数据库中的所有字段都改为英文名字。


在实际数据库的转换过程中同时发现的问题还有:该程序执行完一次后不能把关系型数据库中的内容全部取出来。通过调试Lotus Script脚本并多次单步跟踪脚本的执行情况,发现每次都是执行到同一条数据库记录时,ODBCRe-sultSet就认为数据集已经到头了,下面的记录就都丢了。于是使用关系数据库软件打开数据库,并将其中的字段减少若干条后,就可以一次读取出全部记录。至于需要减少多少个字段才能一次读取出全部记录跟原先的关系型数据库的结构有关,需要具体情况具体实验。


三、Lotus Domino中的日期处理

上面程序中有如下一段程序:

If Isdate(value) Then

If value=Datevalue(“0:00:00″) Then

value=” ”

Else

value=Format(value,”mm-dd-yyyy”)

End If

Set item=doc.AppendItemValue(field,value)

End if

这一段代码的作用是:判断从关系库中读取出来的字段是否为日期型字段,如果是,那么判断此日期型字段的值,看它是否为空,如果为空则在写入Notes库的时候做处理,保证写入的是空日期类型,如果此字段的值不为空则直接写入Notes库;如果此字段不是日期型字段,则不做任何处理。


若是不做上述处理,那么通过ODBCResultSet类取出的日期型字段的值如果为空,则写入Notes库的时候不知什么原因会写入”1899年12月30日”这个日期。


在代码中,使用到了一个DateValue(string)函数,此函数的功能是将字符串参数转换成日期数据类型,如果字符串所表示的内容找不到合法的日期数据与之对应,那么此函数将保留字符串的值不变,而仅仅把其数据类型转换成日期型,即实现了强制类型转换函数的功能。而代码中的”0:00:00″字符串是个特殊字符串,在通过ODBC数据源读取关系数据库的记录时,如果关系库中的日期型字段值为空,那么取出的值就是”0:00:00″形式的日期。使用DateValue(”0:00:00″)语句就可以判断取出的日期型变量的值是否为空,如果为空则将变量Value的值赋成空字符串,然后再写入Notes库中,就可避免出现”1899年12月30日”这个日子了。


四、NotesItem

NotesItem是可以代表所有表单元素的对象,简单地说就是所有可放置在表单上的元素,在Lotus Script程序中都可以用NotesItem对象表示并对其进行操作。上面代码中的doc.AppendItemValue(fieldname,value)函数的作用就是根据Value的值为表单追加域(也就是关系库中的字段)。


其实细心的读者一定已经发现了,在上面关于空日期的处理代码中,为什么要先把Value的值赋成空,然后再写入库中呢?为什么不可以直接往库里写值呢?问题的关键就在NotesItem上。


NotesItem有很多属性,其中最重要的两个是Name和Text属性。Name属性存放表单元素的名称(即fieldname),而Text属性存放表单元素的值(value)。在程序执行到doc. AppendItemValue(fieldname,value)函数的时候,Notes将域名(fieldname)和相对应的值(value)写到NotesItem对象中。执行Call doc.Save()函数之后,所有内存中的NotesItem对象被存入相关联的表单中。


在研究如何处理空日期的过程中,最初的想法是直接将空字符串写入NotesItem中,但是在查看帮助并单步跟踪脚本的执行后发现上述方法行不通。原因在于NotesItem的Text属性是只读的,根本无法为其赋值,同时也没有相应的赋值函数,显然函数doc.AppendItemValue(fieldname,value)是专门给Text属性赋值的函数。


五、Notes中视图与表单的关联

在开发过程中,由于一次错误,我们意外地发现了Notes中视图与表单的关联技巧。Notes为每个表单都设置了名称与别名两个属性,这两个名字都能标识表单。在开发过程中,我们所开发的库有两个表单,分别命名为Form1和Form2,其各自的别名由于疏忽都设成了Docu-ment,而每个表单都有一个视图与之对应。在设计Form2的视图时,虽然指定视图中的列都与Form2中的域相关联,但是在运行的时候从视图中双击某条文档欲对其进行编辑时,切换到的表单却是Form1的,多方查找均不能解决这个问题,于是抱着试试看的心理改变了表单的别名,分别为Document1和Docu-ment2,结果问题解决。但是又出现了Form1的视图无法切换到表单的情况,于是又将Form1的别名改回Document,两个视图均能正确切换到自己的表单上了。


由此发现,Notes在建立视图与表单的关联的时候,首先看表单是否具有别名,如果有,则用别名进行关联,一旦对表单的别名进行了改变就得重新设计视图,如果不想重新做视图就不能改变表单的别名。当然同时也可以应用这一技巧实现从视图中切换到不同表单的功能。如果表单没有别名,则使用名称进行关联。


JDBC连接Domino向导

一.需要的环境:

在连接前必须安装:

a.Sun JDK 1.1.6或是更高的版本,并设置JVM的环境。

b.Lotus Domino Server 4.6 或是更高的版本。

c.Lotus Domino Driver for JDBC 1.1 。

二.连接程序编写:

a.必须将包 lotus.jdbc.domino.* 包含在程序开头。例:import lotus.jdbc.domino.*

b.调出Domino的驱动程序。例:Class.forName(lotus.jdbc.domino.DominoDriver); 注意捕捉ClassNotFoundException异常。


c.给出JDBC URL。例:url=jdbc:domino:/DatabaseName.nsf/ServerName 解释为jdbc:domino: 为JDBC URL连接协议的固定字,DatabaseName.nsf 为Domino数据库文件名,ServerName 为Domino服务器名。假设连接服务器名为Webserver上的names.nsf , url=jdbc:domino:/names.nsf/webserver ;假设连接服务器名为Webserver,office目录下的job.nsf ,
url=jdbc:domino:/officejob.nsf/webserver ;设置连接超时100秒,url=jdbc:domino:/simpler.nsf;threadtimeout=100 。


d. 建立连接。Connection con = DriverManager.getConnection(String JDBCURL);

三. 部分连接例程:

import java.sql.*;

import lotus.jdbc.domino.*;

public class example{

public static void main (String[] args) {

Connection con=null;

Statement stmt=null;

ResultSet rs=null;

String sql= SELECT * FROM Person;

String connStr = jdbc:domino:/names.nsf/webserver/weboa;

Class.forName(lotus.jdbc.domino.DominoDriver);

con = DriverManager.getConnection(connStr);

stmt = con.createStatement();

rs = stmt.executeQuery(sql); … .. }}

四.在润乾自定义数据集中,只需要将该连接例程获得的结果集转化为DATESET二维数组即可。

DOMINO的JDBC和ODBC连接方法的更多相关文章

  1. jdbc知识点(连接mysql)

    jdbc连接mysql 1.JDBC简介 JDBC: 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库.从根本上来说,JDBC ...

  2. Java JDBC Thin Driver 连接 Oracle 三种方法说明(转载)

    一.JDBC 连接Oracle 说明 JDBC 的应用连接Oracle 遇到问题,错误如下: ORA-12505,TNS:listener does not currently know of SID ...

  3. JDBC 与ODBC的区别

    一.ODBC(Open   DataBase   Connectivity   :  开放数据库连接)         ODBC  总体结构  应用程序    执行处理并调用odbc函数,提交sql语 ...

  4. jdbc和odbc

    JDBC简介 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,它是Java十三个规范之一.可以为多种关系数据库提供统一 ...

  5. Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决

    Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...

  6. JDBC与ODBC

     ODBC(Open Database Connectivity)是一组对数据库访问的标准API,这些API通过SQL来完成大部分任务,而且它本身也支持SQL语言,支持用户发来的SQL.ODBC定义了 ...

  7. JDBC与ODBC的区别

    JDBC简介JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,它是Java十三个规范之一.可以为多种关系数据库提供统一访 ...

  8. jdbc事务处理和连接池

    JDBC: * JDBC概念:Java DataBase Connectivity(Java数据库连接) SUN公司提供的一组连接数据库API. * JDBC开发步骤: * 1.注册驱动. * 2.获 ...

  9. ODBC连接发生错误:未发现数据源名称并且未指定默认驱动程序

    程序在使用ODBC方式连接数据库时发生错误: ERROR [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序. 什么原因造成的呢? 本人使用&l ...

随机推荐

  1. Spring Security构建Rest服务-0900-rememberMe记住我

    Spring security记住我基本原理: 登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFilter,当该过滤器认证成功后,会调用RememberMeS ...

  2. 目录打散-hash算法

    前几篇说了文件上传,都是上传到了WebRoot下的up目录,这样是不行的,文件多了性能就不行了.文件一般都是分目录存放的,这里讲建目录的一种算法.先看结果,经过本算法建的目录,结构是这样的,还以up目 ...

  3. 关于Spring的一点东西

    Spring IoC 容器 容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁.Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件.这些对象被称为 Spr ...

  4. c++面试题中经常被面试官面试的小问题总结(一)(本篇偏向基础知识)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10711810.html 1.类中的函数定义后加了一个const代表什么? 代表它将具备以下三个 ...

  5. mongodb与关系型数据库优缺点比较

    1.与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度②文档结构的存储方式,能够更便捷的获取数据③内置GridFS,支持大容量的存储.④内置Sharding.⑤第 ...

  6. Java 集合框架(一)—— 接口综述

    前言:凡是使用 Java 编程的,几乎肯定会用到集合框架,比如 ArrayList.LinkedList.HashSet.HashMap 等,集合框架的代码绝对是大师级的实现,所以为了更好地使用集合框 ...

  7. Node.js链式回调

    由于异步的关系,代码的书写顺序可能和执行顺序并不一样,可能想先执行A再执行B,但由于异步可能B要先于A执行.例如在OC中使用AFnetworking请求数据然后刷新页面,由于网络请求是用block实现 ...

  8. 【WePY小程序框架实战一】-创建项目

    最近两个小程序项目使用了微信自己出的框架wepy开发,开发完的感受就是比原生小程序顺溜很多.我就从安装到一些重点和整个项目把wepy使用整理下 全局安装WePY命令行工具 npm install we ...

  9. 关于PLSQL启动用时较长的问题解决

    问题: 打开登陆界面缓慢. 解决: 1.删除控制面板中的打印机 2.将打印机改为手动并停止启动状态 .

  10. Kafka、RabbitMQ、RocketMQ消息中间件的对比

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,目前对Kafka.RabbitMQ.RocketMQ这三个消息中间件做下对比分析. - - k ...