Domino和关系数据库进行交互是日常项目开发中经常涉及到的一个方面,每个domino开发人员都写过这样的程序,本文就这个方面做一下简单的总结。
一、工具篇
1、使用LEI(Lotus Enterprise Integrator)
LEI的英文全称是Lotus Enterprise Integrator ,它是以前大家熟知的NotesPump的升级产品,是基于服务器的数据分布产品,提供了定义和管理以下事物的环境:
*大量的数据交换
*数据同步
:事件驱动和实时的数据传输
LEI服务器处理指令,建立到外部数据源的连接,按照定义好的活动的条件来传输数据.它要求Domino 4.6x 或 5.x以上版本的服务器,可以单独运行,也可以作为一个内部的服务器任务运行.
Lotus Enterprise Integrator (LEI) 6.x 可以将附件从 Domino 数据库移到 RDBMS 表中,从而可以从 RDBMS 内读取这些附件。更重要的是,此项操作可以快速进行,而不需要编写任何脚本代码。关于此方面,IBM官方网站上有对此操作的详细步骤说明,有兴趣的同行可以阅读一下,链接: http://www.ibm.com/developerworks/cn/lotus/LEI-p_w_uploads/index.html
2、DESC(Domino Enterprise Connection Services )
DECS的英文全称是Domino Enterprise Connection Services ,是LEI的子集,它仅仅是实时的Notes活动.DECS是一个基于向导器的服务器任务,包含于Domino 4.6.3及其以后的版本.它修改NOTES.INI文件以包括实时的扩展:extmgr_addins=ndecsext.dll (for NT)
下面,介绍一下DECS的用法,本文将以一个非常简单的例子为大家说明一下使用过程,更复杂的使用,大家可以据此做更深入的研究。我们以用notes导入一个Access数据库为例(该数据库已注册到ODBC中) 
预备工作: 
保证有你要导入的Notes数据库。 
保证有Access数据库 
保证ODBC已经加入该Access数据库数据源。 
第一步: 
如果你是第一次使用DECS,请查看你的服务器的DATA目录下是否有decsadm.nsf的数据库,如果没有这个数据库,要以Domino自带的名为decsadm.ntf的模板建立本数据库,关于DECS的相关设置都会在本数据库中进行。
第二步: 
在服务器的控制台上输入Load DECS, 
第三步:
任务启动后,打开服务器上的Decsadm.nsf数据库。 
第四步: 
单击"Create Connection",创建一个连接。选择你要创建的数据库类型(DB2,Or I
acle,ODBC)。本例选择ODBC. 
第五步: 
打开连接表单后: 
表单中有以下几项: 
Data Source:输入数据源。 
本例中输入ODBC中你要连接的数据源的名字。 
Username:输入能访问该数据源的用户名。
Password: 输入能访问该数据源的用户密码  Password encryption key:单击后对你填入的用户密码,在Notes中加密。 
Selection Type:你选择的类型是Table ,还是View 
:选择Table的拥有者。
Name: 选择你要连接哪一个Table. 
填完后保存退出。
第六步: 
单击"Create Activity",创建一个"动作"。系统提供了一个动作向导,单击"Create Activity",系统打开表单后弹出一个动作向导,如果你确定使用的话,单击"确定"。
选择你要导入到哪个Notes数据库。 
选择你要导入到该数据库的哪个表单。 
选择你使用哪个"连接"(第四步创建的) 
选择你到导入外部数据库的哪个Table和View. 
这时会出来Key和数据域的映射。
Key:是你的主索引。 
Field:是你要分别对应的字段。 
在左边选择Notes的域,右边选择外部数据库的字段。
选择你对外部数据库的动作Open,create,update,delete 
输入你为该导入动作取的名字。然后保存关闭当前文档。
第七步: 
1.查看"Activities"导航,选定你要激活哪个"动作" 
单击"Start",启动该动作。 
如果不成功,你单击"log",如果你想停止该动作请单击"Stop" 
图标说明:第一个图标表示该动作没激活,第二个图标表示动作正在激活,第三 个图标表示动作已激活。 
第八步: 
1.打开你要导入的Notes数据库,用你刚才第六步第2点的表单创建文档。 
在你对应KEY的域中输入输入外部数据库的某一个数据。如:如果我把Access 数据库中table的ID字段作为key,而对应notes中的test域,那么我们就应该在test域中输入:如:"10203" 
保存当前该文档。 
第九步: 
在视图中打开刚才创建保存的Notes文档。我们就会发现在其他映射的域都会出现 对应在外部数据库中的数据。这样外部数据库中的数据就引入到了Notes中了。
DECS与LEI存在一定的区别,大致可以概括为:
1 LEI提供了一个多功能的数据访问工具集,可以对其编程;DECS仅限于事先定义好的功能;2 LEI能处理大规模的数据传输,DECS仅工作在文档级;3 LEI 能适用于两个非Notes的数据源,DECS要求Notes作为一个数据源。
3、和DB2的数据交互
Domino在发布版本7的时候,就提供了Domino和DB2的数据集成功能,只是在这个版本上,IBM也只是做一下尝试,并不对此项功能进行技术支持以及其它的相关服务,随着Domino8的发布,IBM官方声明Domino8已经支持这个功能了,个人感觉,这里与其说是和DB2的数据交互,不如叫和DB2的数据共享。按照IBM提供的相关帮助文档,进行正确的配置以后,就可以达到将所有Domino的数据移植到DB2中,使Domino中的数据库只剩一个躯壳,所有真正的数据都存在DB2中,我查看了一下,这样配置之后,Domino中的数据库仅剩10几个字节,但是对用户来说,没有任何变化,这个功能非常强大,只可惜目前只支持DB2关系数据库,毕竟数据库也是人家自己的东西,也许在不久的将来会支持其它流行关系数据库吧,期待ing!对于这方面的使用,大家仔细参考帮助照做即可,这里就不多说了。
二、程序篇
1、使用ODBC
使用这个解决方案的前提条件,下面两个条件必具其一:
a、程序是运行在客户端,即:CS模式,且客户端所在操作系统是window系列;
b、程序运行在服务器,且服务器所在操作系统是windows系列;
本解决思路主要是使用Domino提供的三个类:ODBCConnection、ODBCQuery、ODBCResultSet,暂时手头上还没有这方面的例子,所以就不提供了,如果有的兄弟,请发上来,我编辑到本文章中,提前谢了。大家同样可以参考Designer的帮助,找到一些启示。
2、使用JDBC
一般情况下,不建议在Domino编程中使用java,这个众所周知,Lotus对Java的支持实在不敢恭维,但是如果受客观条件的限制,只能用JDBC,那就没办法了,比如我们公司,bs结构,服务器所在操作系统是Solaris,使用工具肯定不会去考虑,也不具备使用ODBC的条件,只能赶鸭子上架了,不过一般情况下,如果程序比较健壮,对于一些java对象做了合理的释放,短期内应该不会出现什么问题。言归正传,使用步骤:
a、找到oracle的jdbc驱动包:class12.jar;
b、或可在建立代理后,直接在设计端引入该jar包;或将该jar包上传到服务器,修改Notes.ini文件,增加JavaClasses参数进行引入;
c、下面给出一小段代码,这个相信大家也都很熟悉了,就不多说了,不过多一嘴,如果确认你所有的步骤都操作正确,java代理还是不能正确运行的话,可以尝试将代理的安全限制设置为:允许受限操作。
import lotus.domino.*;
import java.sql.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
Connection conn = null;
 Statement stmt = null;
ResultSet rs = null
try {
Session session = getSession();
   AgentContext agentContext = session.getAgentContext();
   Class.forName("oracle.jdbc.driver.OracleDriver");
   String url = "jdbc:oracle:thin:@IP地址:1521:PROD";
   String user = "***";
   String password = "***";
   conn = java.sql.DriverManager.getConnection(url,user,password);
   stmt = conn.createStatement();
 String sql = "select * from ra_salesreps_all";
rs = stmt.executeQuery(sql);
   while(rs.next()){
System.out.println(rs.getString("name"));   }
} catch(Exception e) {
{ e.printStackTrace();
  }finally{
  try{
    rs.close();
    stmt.close();
 conn.close();
   }catch(SQLException sqle){
System.out.println(sqle);
}
}
}
}