利用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. 百度地图笔记_覆盖物(标注marker,折线polyline,多边形polygon)的点击弹窗和右键菜单

    利用绘制工具绘制点线面,并在执行绘制完成回调事件给相应覆盖物添加事件操作,提供标注的点击弹窗和标注.折线.多边形的右键删除 效果图如下: 完整代码如下:html+js <!DOCTYPE htm ...

  2. 页面按钮埋点+跟踪location.search

    <a href="javascript: void(0)" onclick="setUrl('https://baoxian.pingan.com/pa18shop ...

  3. 剑指offer四十三之左旋转字符串

    一.题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...

  4. Pycharm常用快捷键,以及设置

    工欲善其事必先利其器,Python开发利器Pycharm常用快捷键以及配置如下,相信有了这些快捷键,你的开发会事半功倍 一 常用快捷键 编辑类: Ctrl + D             复制选定的区 ...

  5. apache URL重写 标志表 以及 错误解决方法

    Apache mod_rewrite规则重写的标志一览 1) R[=code](force redirect) 强制外部重定向 强制在替代字符串加上http://thishost[:thisport] ...

  6. Android 使用zxing生成二维码的方法

    public void createQRImage(String url) { try { // 判断URL合法性 if (url == null || "".equals(url ...

  7. Javac语法糖之TryCatchFinally

    https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.3 Optionally replace a try s ...

  8. facebook 摘要生成阅读笔记(一) A Neural Attention Model for Sentence Summarization

    流程: 1.文本和摘要全部输入到模型中. 2.训练时,对生成摘要取前C个词,从头开始取,如果生成的摘要不足C,那么不足的地方直接补<s>. 3.训练时,最大化生成的摘要与原摘要的概率,即每 ...

  9. Linux 文件内容查看工具介绍-cat,less,more,tail,head

    Linux 文件内容查看工具介绍 作者:北南南北来自:LinuxSir.Org摘要: 本文讲述几种常用文件内容的查看工具,比如cat.more.less.head.tail等,把这些工具最常用的参数. ...

  10. OOAD之面向对象设计原则

    学习这个设计模式 真的觉得很抽象,只有自己多多的领会! 在很多时候,很多的知识都会觉得讲起来是很矛盾的. 本章目标 1 掌握内聚度和耦合度的概念 2 掌握面向对象设计原则  (一)如何衡量软件设计的质 ...