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-attachments/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,请查看你的服务器的DA TA目录下是否有decsadm.nsf的数据库,如果没有这个数据库,要以Domino自带的名为decsadm.ntf的模板建立本数据库,关于DECS的相关设置都会在本数据库中进行。
第二步:
在服务器的控制台上输入Load DECS,
第三步:
任务启动后,打开服务器上的Decsadm.nsf数据库。
第四步:
单击"Create Connection",创建一个连接。选择你要创建的数据库类型(DB2,Or I
acle,ODBC)。本例选择ODBC.
第五步:
打开连接表单后:
表单中有以下几项:
Da ta 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代理还是不能正确运行的话,可以尝试将代理的安全限制设置为:允许受限操作。
imp ort lotus.domino.*;
imp ort 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);
}
}
}
}
转自: http://liyuanning.blog.163.com/blog/static/457322862009920112128848/