《利用ODBC实现Domino和关系数据库的互操作》由会员分享,可在线阅读,更多相关《利用ODBC实现Domino和关系数据库的互操作(8页珍藏版)》请在金锄头文库上搜索。
1、 利用ODBC实现Domino和关系数据库的互操作-数据库专栏,SQL Server 利用odbc实现domino和关系数据库的互操作lotus domino是当今办公自动化系统的主流研发平台之一,domino自带一个非关系型数据库?文件型数据库,而目前大部分企业的信息都储存在诸如sql server等关系型数据库中,因此,在研发办公自动化系统过程中势必要涉及domino和关系数据库的数据交换问题。一、lotus domino和关系数据库的互操作在lotus domino r5中提供了三个lotus notes扩展类:odbcconnection(odbc连接)、odbcquery(odbc查
2、询)及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 扩展o
3、dbc类第5步:选中“declare”事件,在其中写入:dim session as notessessiondim db as notesdatabasedim doc as notesdocumentdim qry as odbcquerydim result as odbcresultsetdim con as odbcconnection第6步:选中“click”事件,在其中写入:sub click(source as button) set new valueset session=new notessessionset con=new odbcconnectionset qry=n
4、ew odbcqueryset result=new odbcresultset get current databaseset db=session.currentdatabaseset doc=new notesdocument(db)doc.form=connectioncall 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.co
5、lumns 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)
6、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 ifend sub最后,保存表单并运行,用鼠标点击read操作后,关系数据库中的内容就被取到notes的文件型数据库中了。二、程式存在的问题及解决不过使用上面的代码在进行实际数据库内容转换的时候,我们发现notes 通过odbc数据源连接关系数据库时
7、,无法识别中文字段名。如果关系数据库的字段是中文名字,那么odbcresultset将为空,解决的办法是将关系数据库中的所有字段都改为英文名字。在实际数据库的转换过程中同时发现的问题更有:该程式执行完一次后不能把关系型数据库中的内容全部取出来。通过调试lotus script脚本并多次单步跟踪脚本的执行情况,发现每次都是执行到同一条数据库记录时,odbcre-sultset就认为数据集已到头了,下面的记录就都丢了。于是使用关系数据库软件打开数据库,并将其中的字段减少若干条后,就能一次读取出全部记录。至于需要减少多少个字段才能一次读取出全部记录跟原先的关系型数据库的结构有关,需要具体情况具体实验
8、。三、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库;如果
9、此字段不是日期型字段,则不做所有处理。若是不做上述处理,那么通过odbcresultset类取出的日期型字段的值如果为空,则写入notes库的时候不知什么原因会写入“1899年12月30日”这个日期。在代码中,使用到了一个datevalue(string)函数,此函数的功能是将字符串参数转换成日期数据类型,如果字符串所表示的内容未找到合法的日期数据和之对应,那么此函数将保留字符串的值不变,而仅仅把其数据类型转换成日期型,即实现了强制类型转换函数的功能。而代码中的“0:00:00”字符串是个特别字符串,在通过odbc数据源读取关系数据库的记录时,如果关系库中的日期型字段值为空,那么取出的值就是“
10、0:00:00”形式的日期。使用datevalue(“0:00:00”)语句就能判断取出的日期型变量的值是否为空,如果为空则将变量value的值赋成空字符串,然后再写入notes库中,就可避免出现“1899年12月30日”这个日子了。四、notesitemnotesitem是能代表所有表单元素的对象,简单地说就是所有可放置在表单上的元素,在lotus script程式中都能用notesitem对象表示并对其进行操作。上面代码中的doc.appenditemvalue(fieldname,value)函数的作用就是根据value的值为表单追加域(也就是关系库中的字段)。其实细心的读者一定已发现了
11、,在上面关于空日期的处理代码中,为什么要先把value的值赋成空,然后再写入库中呢?为什么不能直接往库里写值呢?问题的关键就在notesitem上。notesitem有非常多属性,其中最重要的两个是name和text属性。name属性存放表单元素的名称(即fieldname),而text属性存放表单元素的值(value)。在程式执行到doc. appenditemvalue(fieldname,value)函数的时候,notes将域名(fieldname)和相对应的值(value)写到notesitem对象中。执行call doc.save()函数之后,所有内存中的notesitem对象被存入
12、相关联的表单中。在研究怎么处理空日期的过程中,最初的想法是直接将空字符串写入notesitem中,不过在查看帮助并单步跟踪脚本的执行后发现上述方法行不通。原因在于notesitem的text属性是只读的,根本无法为其赋值,同时也没有相应的赋值函数,显然函数doc.appenditemvalue(fieldname,value)是专门给text属性赋值的函数。五、notes中视图和表单的关联在研发过程中,由于一次错误,我们意外地发现了notes中视图和表单的关联技巧。notes为每个表单都设置了名称和别名两个属性,这两个名字都能标识表单。在研发过程中,我们所研发的库有两个表单,分别命名为form
13、1和form2,其各自的别名由于疏忽都设成了docu-ment,而每个表单都有一个视图和之对应。在设计form2的视图时,虽然指定视图中的列都和form2中的域相关联,不过在运行的时候从视图中双击某条文件欲对其进行编辑时,转换到的表单却是form1的,多方查找均不能解决这个问题,于是抱着试试看的心理改动了表单的别名,分别为document1和docu-ment2,结果问题解决。不过又出现了form1的视图无法转换到表单的情况,于是又将form1的别名改回document,两个视图均能正确转换到自己的表单上了。由此发现,notes在建立视图和表单的关联的时候,首先看表单是否具有别名,如果有,则用
14、别名进行关联,一旦对表单的别名进行了改动就得重新设计视图,如果不想重新做视图就不能改动表单的别名。当然同时也能应用这一技巧实现从视图中转换到不同表单的功能。如果表单没有别名,则使用名称进行关联。 使用ODBC实现Domino与SQL Server数据交互2007年12月13日 17:47通过ODBCResultSet.AddRow向SQL Server数据库里写入数据,实现与关系数据库的数据交互。Uselsx *LSXODBCDim s As New notessessionDim db As notesdatabaseDim doc As notesdocumentDim con As New ODBCConnectionDim qry As New ODBCQueryDim result As New ODBCResultSetDim sunid As StringDim sname As StringOn Error Goto errorHandlerSet qry.Connec