Domino连接Oracle解决方案

Domino连接Oracle解决方案

一.        前言

本文只简单介绍了DominoOracle交互的基本方法,没有设计到复杂的技术。具体复杂的应用还请读者参考其他文章。文中使用了连接池,在本文中并没有具体介绍连接池的设计方案,在下一篇文章中将会就具体连接池设计方案作个说明!本文只做技术探讨之用,对文中的错误欢迎指正。

 

 

一.        应用背景

Domino中开发应用程序经常要存取一些关系数据库中的数据,在以前的Domino系统中除了使用昂贵的LEI,再有就是ODBC了(谁还用过其他的工具?)。但是就像社会在不断进步一样,Domino也在不断进步。在IBM推出Domino6.0后,一切似乎都在改变!IBM似乎意识到了Domino与其他系统交互数据的重要性,在Domino6.0中增加了DCRDECS,当然LEI还是在跟进。虽然Domino6.0的数据整合功能更加强大了,但有一点,都是通过配置来实现与其他数据库的交互。配置的好处就是,点几下鼠标,建几个文档一个应用就OK了,根本不需要复杂的编程,繁琐的测试。缺陷就是不够灵活,往往这些配置类的工具不能满足我们的需要,或者这些工具本身有缺陷,造成我们需要过多的人工维护,比如DECS。当然,我们的需求不同,要求就不一样,在我做的项目里DECSlEI并不能满足我的要求,DCR只能与DB2关联,不是我需要的。因此我的这篇文章里所讲的方法并不一定适合您。好了,继续。

既然这些工具不能为我所用,那我们就想办法通过其他途径达到我们目地。幸好在Domino6以后对Java的支持力度增强了,可实现的功能增多了,给我们选择的方法也多了。

我就想一个问题,以前我做项目需要存取其他数据库中的数据,只能利用Windows平台的ODBC驱动。这么做的代价就是只能在Windows平台上部署应用,而不能用类Unix系统,这就好像被人束缚了手脚一样。我的要求是能跨平台,这么一来就只有一个选择了—JDBC

这并不奇怪,当今企业应用中只有JDBC ODBC两种跨数据库连接技术,非彼即此,倒也没什么可选的,不过在跨平台这一项上,只有JDBC才能胜任。那么怎么才能让Domino使用JDBC驱动那,其实也很简单。大家跟着我一步一步去做,一样能办到。以下开始切入正题。

二.实际操作

1.准备开发环境

现说一下开发环境:

Domino平台:Domino 6.5.5

操作系统:AIX5.3

数据库:Oracle 9.2.0 .8

开发工具:Lotus Designer + Eclipse

大家也可以在自己的机器上试验Domino 6.5.5 + WinXp + MySQL的组合,完全可以实现。

准备OracleJDBC驱动classes12.jar,Jar包拷贝到Domino程序目录下的jvm/lib/ext目录下,然后重启Domino服务器。好了在你的程序中可以使用JDBC驱动了,很简单吧!

2.新建Domino设计元素

现在我开始实际的操作。新建一个数据库jdbctest.nsf,然后在新建一个表单frmjdbctest

,在表单中新建几个字段,和两个按钮。如图

下图是在IE浏览器中的样式。

3.Oracle中新建表

如图。新建jdbctest表,包含字段fld_name,fld_general, fld_birthdayyear, fld_birthdaymonth, fld_birthdayday

4.编写程序

编写两个代理agtDominoToOracle(附件一) agtOracleToDomino(附件二)

按钮“存数据”触发代理agtDominoToOracle

按钮“取数据”触发代理agtOracleToDomino

5.运行程序

先在表单填写数据,然后点击“存数据”按钮。

然后点击“取数据”按钮现实存在Oracle中的数据。

这是通过pl/SQL取的数据,如下图

Domino中输入的数据已经存进Oracle中,而Domino中没有任何数据保存。

 

下图是点击“取数据”按钮,得到的Oracle中的数据

 

二.        小结

通过以上步骤大家应该可以看到DominoOracle 甚至是其他数据库的交互其实很简单,这并不是什么高深的技术,本文的目的也是抛砖引玉。希望大家都贡献出自己的智慧,让我们共同努力,Domino的明天会更好!

 

 

 

 

 

 

 

 

 

 

附件一: 代理agtDominoToOracle源程序

import lotus.domino.*;

import java.sql.*;

 

import com.sinosoft.dao.PoolManager;

 

public class agtDominoToOracle extends AgentBase {

 

    public void NotesMain() {

       Session session = null;

       AgentContext agentContext = null;

       Document docContext = null;

      

       StringBuffer strSQL = null;

       String strname = null;

       String strgeneral = null;

       String strbir_year = null;

       String strbir_month = null;

       String strbir_day = null;

       Connection conn = null;

       Statement stmt = null;

       int iUpdate = 0;

      

       try {

           session = getSession();

           agentContext = session.getAgentContext();

           docContext = agentContext.getDocumentContext();

          

           //下面这段程序,大家可能不太明白了,这是取连接池

           PoolManager pm = PoolManager.getInstance();

           conn = pm.getConnection("platform");

          

           //下面这段是采取直连方式访问Oracle

           /*

           Class.forName(strDbDriver);

           conn = DriverManager.getConnection(strDbURL, strUser, strPasswd);

           */

          

           if(conn != null){

              stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

//           

              strname = docContext.getItemValueString("fld_name");

              strgeneral = docContext.getItemValueString("fld_general");

              strbir_year = docContext.getItemValueString("fld_birthdayyear");

              strbir_month = docContext.getItemValueString("fld_birthdaymonth");

              strbir_day = docContext.getItemValueString("fld_birthdayday");

             

              strSQL = new StringBuffer();

              strSQL.append("INSERT INTO JDBCTEST(FLD_NAME,FLD_GENERAL,FLD_BIRTHDAYYEAR,FLD_BIRTHDAYMONTH,FLD_BIRTHDAYDAY) ");

              strSQL.append("VALUES('" + strname + "',");

              strSQL.append("'" + strgeneral + "',");

              strSQL.append("'" + strbir_year + "',");

              strSQL.append("'" + strbir_month + "',");

              strSQL.append("'" + strbir_day + "')");

             

              iUpdate = stmt.executeUpdate(strSQL.toString());

           }

          

          

          

          

       } catch(Exception e) {

           e.printStackTrace();

       }finally{

           try{

              if (docContext != null){

                  docContext.recycle();

              }

              if (agentContext != null){

                  agentContext.recycle();

              }

              if(session != null){

                  session.recycle();

              }

              if(stmt != null){

                  stmt.close();

              }

              if(conn != null){

                  conn.close();

              }

             

           }catch(Exception e){

             

           }

       }

    }

}

 

 

附件二:代理agtOracleToDomino源程序

 

import lotus.domino.*;

import java.sql.*;

 

import com.sinosoft.dao.PoolManager;

 

public class agtOracleToDomino extends AgentBase {

 

    public void NotesMain() {

       Session session = null;

       AgentContext agentContext = null;

       Document docContext = null;

      

       String strSQL = null;

       String strname = null;

       String strgeneral = null;

       String strbir_year = null;

       String strbir_month = null;

       String strbir_day = null;

       StringBuffer strHtml = null;

       Connection conn = null;

       Statement stmt = null;

       ResultSet rs = null;

      

       try {

           session = getSession();

           agentContext = session.getAgentContext();

           docContext = agentContext.getDocumentContext();

           System.out.println("run");

           //下面这段程序,大家可能不太明白了,这是取连接池

           PoolManager pm = PoolManager.getInstance();

           conn = pm.getConnection("platform");

          

           //下面这段是采取直连方式访问Oracle

           /*

           Class.forName(strDbDriver);

           conn = DriverManager.getConnection(strDbURL, strUser, strPasswd);

           */

          

           if(conn != null){

              stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

              strSQL = "SELECT * FROM JDBCTEST";

              rs = stmt.executeQuery(strSQL);

              strHtml = new StringBuffer();

              strHtml.append("[<table>");

              strHtml.append("<tr><td>姓名</td>");

              strHtml.append("<td>性别</td>");

              strHtml.append("<td>生日</td></tr>");

              while(rs.next()){

                  strname = rs.getString("fld_name");

                  strgeneral = rs.getString("fld_general");

                  strbir_year = rs.getString("fld_birthdayyear");

                  strbir_month = rs.getString("fld_birthdaymonth");

                  strbir_day = rs.getString("fld_birthdayday");

                  strHtml.append("<tr><td>" + strname + "</td>");

                  strHtml.append("<td>" + strgeneral + "</td>");

                  strHtml.append("<td>" + strbir_year + "" +strbir_month + "" + strbir_day +  "" +"</td>");

              }

              strHtml.append("</table>]");

              docContext.replaceItemValue("disOracledata", strHtml.toString()).recycle();

           }

 

          

       } catch(Exception e) {

           e.printStackTrace();

       }finally{

           try{

              if (docContext != null){

                  docContext.recycle();

              }

              if (agentContext != null){

                  agentContext.recycle();

              }

              if(session != null){

                  session.recycle();

              }

              if(stmt != null){

                  stmt.close();

              }

              if(conn != null){

                  conn.close();

              }

             

           }catch(Exception e){

             

           }

       }

    }

}

 

 

 

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值