日期:2013-09-22  浏览次数:20646 次


利用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的值为表单追加域(也就是关系库中的字段)。

  其实细心的读者一定曾