Lotus Domino和关系型数据库(LEI,DESC,JDBC连接)

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/developerwork ... achments/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 racle:thinIP地址:1521 ROD";
   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);
}
}
}
}

开发思路: 使用ADO通过ODBC链接进行Louts数据读取,在建立一个与SQL server数据库相连的ADO,将读取数据写入SQL server数据库。 安装环境: 首先安装lotus_notes853_win_SC(lotus客户端软件) 然后安装LOTUS_NOTES_SQL_853_W32_CIC6PEN(顺序好像有关系,win8.1安装64位不能正常使用,一定要安装32位的) 数据库连接: 先通过lotus客户端软件连接登陆成功,需要admin.id文件 通过ODBC 数据源(32 位) 添加 Lotus Notes SQL Driver(*.nsf)数据源,选择自己的loust数据库文件.nsf delphi ADO控件通过ODBC Drivers直接连接,本程序中用例名设置为LotusOA,每次连接需要输入lotus密码,其他开发这里就不在介绍可以看源代码 delphi ADO控件连接自己本地的SQL Server数据库,程序下载后自己修改 软件使用: 1、配置:通过config.ini修改LOTUSCONN,即LotusOA设置为自己的建立ODBC的名字,关系数据库修改DBCONN,本例中为SQLServer数据库 2、启动程序,点“数据源链接”,程序连接lotus数据库和Sql server数据库 设置原始表名:通过lotus设计程序中的试图中可以看到,大部分是fm_Main,设置创建表名用于数据导出的表 3、获取表字段,会读处lotus数据的所有表名,自动目标生成表创建的sql语句,默认字段长度都是254,如需要可以自己修改 4、点“创建表”按钮,如果已创建了不要再点这个按钮 5、点“导出数据”,程序开始自动导出数据 如果目标数据库是其他类型数据库,可自己通过配置文件config.ini中的DBCONN进行修改 lotus导入关系数据库的资源一直很难找,自己的一点拙见,希望对大家有用。
以下是俺学习参考别人有关NOTES与关系数据库互相操作的文档后更新的LOTUSSCRIPT程序代码 Set con=New ODBCConnection Set qry=New ODBCQuery Set rs=New ODBCResultSet Set qry.Connection = con Set rs.Query=qry Set ws=New notesuiworkspace Set uidoc=ws.currentdocument Dim s As New NotesSession Dim db As NotesDatabase Dim tempdoc As NotesDocument Dim StudentView As NotesView Dim j As Integer Set db=s.CurrentDatabase Set StudentView = db.GetView("($studentid)") Call con.ConnectTo("arice","","") qry.SQL="Select * From people" rs.execute rs.LastRow rs.CurrentRow = currentrow If Cstr(uidoc.fieldgettext("Saveoptions"))="0" Then '如果是新建表单 Set tempdoc=StudentView.GetDocumentByKey(Trim(uidoc.fieldgettext("Student_ID")),True)'判断是否在视图存在此学生id的表单 If Not tempdoc Is Nothing Then'如果存在 Messagebox "系统已经存在,请不要重复录入",,"警告" continue=False Exit Sub Else j = 0 For i = 1 To rs.NumRows rs.CurrentRow = i If Cstr(rs.GetValue("Cname")) = Cstr(uidoc.FieldGetText("Student_ID")) Then j = j + 1 End If Next '==============更新操作================================================== If j > 0 Then Call rs.SetValue("Student_id",Cstr(uidoc.FieldGetText("Student_ID"))) 'Messagebox "执行第一条语句" Call rs.SetValue("CName", Cstr(uidoc.fieldgettext("CName"))) 'Messagebox "执行第二条语句" Call rs.SetValue("EName", Cstr(uidoc.fieldgettext("EName"))) Call rs.SetValue("Address",Cstr(uidoc.fieldgettext("Address"))) Call rs.SetValue("Tel",Cstr(uidoc.fieldgettext("Tel"))) 'Messagebox "执行第五条语句" If rs.UpdateRow Then Messagebox "提交SQL数据库成功" 'Call uidoc.fieldsettext("Saveoptions","1") Call uidoc.Save(False,False) Else Messagebox "保存SQL数据库失败" Exit Sub End If Else Messagebox "是新增的文档,待定新增代码处理!" '====================新增保存代码========================= rs.AddRow Call rs.SetValue("Student_id",Cstr(uidoc.FieldGetText("Student_ID"))) Call rs.SetValue("CName", Cstr(uidoc.fieldgettext("CName"))) Call rs.SetValue("EName", Cstr(uidoc.fieldgettext("EName"))) Call rs.SetValue("Address",Cstr(uidoc.fieldgettext("Address"))) Call rs.SetValue("Tel",Cstr(uidoc.fieldgettext("Tel"))) If rs.UpdateRow Then Call uidoc.fieldsettext("Saveoptions","1") Call uidoc.Save(True,False) Messagebox "提交SQL数据库成功" Else Messagebox "保存SQL数据库失败" Exit Sub End If End If End If 'Messagebox "执行update条语句" Else Call rs.SetValue("Student_id",Cstr(uidoc.FieldGetText("Student_ID"))) 'Messagebox "执行第一条语句" Call rs.SetValue("CName", Cstr(uidoc.fieldgettext("CName"))) 'Messagebox "执行第二条语句" Call rs.SetValue("EName", Cstr(uidoc.fieldgettext("EName"))) Call rs.SetValue("Address",Cstr(uidoc.fieldgettext("Address"))) Call rs.SetValue("Tel",Cstr(uidoc.fieldgettext("Tel"))) 'Messagebox "执行第五条语句" If rs.UpdateRow Then Messagebox "提交SQL数据库成功" 'Call uidoc.fieldsettext("Saveoptions","1") Call uidoc.Save(True,False) Else Messagebox "保存SQL数据库失败" Exit Sub End If End If rs.Close(DB_CLOSE) con.Disconnect
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值