Lotus Domino 与关系数据库的互操作知识集锦

Lotus Domino 与关系数据库的互操作
---- 一. Lotus Domino 与关系数据库的互操作
---- 在项目开发过程中,遇到的第一个棘手的问题是:如何把原先的关系型数据库中的内容全部导入 Domino 中?因为企业现在的所有数据都集中在一个关系型数据库中,因此希望Notes库能与旧的关系库互操作,而不必在数据库转换上浪费更多人力。
---- 此外,由于Lotus Notes是非结构化的数据库,而关系数据库属于结构化数据库,因此要实现两者的互操作或数据导入/导出势必需要一个专门的转换程序,而这个程序一般来说都属于附加品,要么由Lotus提供,要么由数据库厂商提供,如Lotus Notes与Oracle数据库之间的转换就有专门的程序(Pump)。一般在购买Lotus产品的时候Lotus公司不会提供此类产品,如果需要可以单独购买。而对于企业来说,如果企业数据存放在不止一个关系库中,那么就需要购买若干个此类产品,而且还不一定能买的到,因此能否通过Lotus Script编写一个通用的数据库转换程序就成为本次开发的难点之一。
---- 解决这个问题用到了Lotus Domino R5 中提供的三个Lotus Notes 对象类:ODBCConnection(ODBC 连接)、ODBCQuery(ODBC 查询)以及ODBCResultSet(ODBC结果集)。应用这三个类并辅以Lotus Script语言就能实现与关系数据库的互操作问题。
---- 具体解决方法如下:
---- 第一步 在控制面板——>32位ODBC数据源中建立用户数据源Test;
---- 第二步 在Domino R5中新建一个数据库Try,并建立一个空白表单Connection,此表单没有任何内容,然后在表单上创建一个“操作”,起名为“Read”;
---- 第三步 在“Read”操作的编程窗口中选择编程语言为Lotus Script;
---- 第四步 在编程窗口的对象窗口中点击“Option”事件,并写入如下脚本:
---- Uselsx "*lsxodbc" // 使用Lotus Script 扩展对象中的ODBC类
---- 第五步 选中“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
定义程序中使用到的各种对象。
第六步 选中“Click”事件,在其中写入:
Sub Click(Source As Button)
' Set New Value
Set session = New NotesSession
Set con = New ODBCConnection
// 新建ODBCConnection对象实例
Set qry = New ODBCQuery
// 新建ODBCQuery对象实例
Set result = New ODBCResultSet
// 新建ODBCResultSet对象实例
' 取得当前数据库信息
Set db = session.CurrentDataBase
Set doc = New NotesDocument(db)
// 新建文档
doc.form = "connection"
// 新建文档的表单指向connection
Call con.Disconnect()
// 保证con对象当前没有连接其他数据源
If con.ConnectTo("test") Then
// 如果连接成功
Set qry.connection = con
// 将建立好连接的con交给query对象
qry.SQL = "SELECT * FROM Table1"
// SQL 语句
Set result.Query = qry
// 将已经连接上数据源并写好SQL
语句的query对象赋给result对象
Call result.Execute() // 执行SQL语句
Do // 循环直到结果集为空
Call result.NextRow() // 指针指向下一条记录
For i = 1 To result.Numcolumns
// 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,value)
// 将关系库中的值写到Notes当前库的当前表单中
Next
Call doc.save(True,True)
// 当一条记录的所有字段都被写入
Notes库后保存此文档
Set db = session.CurrentDataBase
Set doc = New NotesDocument(db) // 新建文档
doc.form = "connection"
Loop Until result.IsEndOfData
Call con.Disconnect() // 断开与数据源的连接
Else
Messagebox("Could not connect to server")
End If
End Sub

---- 最后,保存表单并运行,用鼠标点击Read 操作后,关系数据库中的内容就被取到Notes的文档型数据库中了。
---- 下面简要说明一下上述代码:
***** 关系数据库的字段要于lotus库的名称域对应
---- 1. New。New 关键字是用来创建Notes 对象的。New 后面是要创建的Notes对象及所需的参数。使用New 关键字需要注意的一点是:在Declare 事件中声明Notes对象的时候不能使用New 关键字,否则编译时会出错;但是在Click 事件中可以按 Dim db As New NotesDatabase(“”,“***.NSF”)格式书写。
---- 2. ODBCConnection 对象是与ODBC建立连接的Notes对象,使用它的ConnectTo方法可以与ODBC用户数据源中定义的任何一个数据源建立连接,同时返回一些相关的信息,如:表的个数,表中的字段数等。
---- 3. ODBCQuery 对象是用户编写标准的SQL查询语句的对象,它的connection 属性是指向已经与ODBC数据源建立好连接的ODBCConnection 对象的;它的SQL 属性是存放用户编写的SQL 语句。
---- 4. ODBCResultSet 对象是执行SQL 查询语句之后存放查询结果的,它的Query 属性是指向包含建立起连接(ODBCConnection)的并写好SQL语句的ODBCQuery对象。
---- 5. ODBCResultSet 对象的NextRow 方法的作用是将ODBCResultSet 的记录指针指向下一条记录。因为在取到关系数据库中的记录之后,ODBCResultSet对象的指针是为空的,也就是说它并不自动指向结果集的第一条记录,NextRow方法即实现了将记录指针指向第一条记录的功能,并且在以后的循环过程中,此方法还将继续把指针逐一指向后面的记录,直到最后一条。
---- 6. 由于原先的关系数据库中的字段比较多,所以采用在程序中直接写入字段名的做法并不明智,因此,本程序使用了ODBCResultSet 对象的FieldName(fieldindex)方法来通过字段的编号获得字段名,然后再使用GetValue(fieldname)函数得到域值,最后调用Document类的AppendItemValue(fieldname,value)函数在表单中追加一个名为fieldname的域并赋值。
---- 在把上述三个对象的属性分别设置好以后,调用ODBCResultSet 对象的Execute 方法,就可以从关系库中读取数据了。
---- 但是使用上面的代码在进行实际数据库内容转换的时候,发现Notes 通过ODBC数据源连接关系数据库时,无法识别中文字段名。如果关系数据库的字段是中文名字,那么ODBCResultSet将为空,解决的办法是将关系数据库中的所有字段都改为英文名字。经过反复测试,发现并不是所有的中文字段名Notes都不识别,是同关系库的驱动程序有关,由于本次开发连接的是Foxpro的DBF数据库,使用的是Foxpro2.6数据库驱动,因此无法通过ODBC获取中文字段名,如果连接的关系库是Microsoft SQL Server7.0则可以通过ODBC数据源识别中文字段名。
---- 在实际数据库的转换过程中同时发现的问题还有:该程序执行完一次后不能把关系型数据库中的内容全部取出来。由于需要转换的关系型数据库的结构比较复杂,共有40多个字段,且包括字符、字符串、日期、数字等多种数据类型,同时库中的记录比较多(共有3000多条记录),因此出现这个问题后,有两个猜测,一是和ODBC驱动所设置的系统缓冲有关,一是和Notes开辟的内存空间有关,然而通过试验,最终认为和Notes有关的可能性最大。这是因为首先,Notes对其所有的类都设置了缓存,这其中也包括ODBCResultSet,通过调试Lotus Script脚本并多次单步跟踪脚本的执行情况,发现每次只要执行到同一条数据库记录(例如第3328条记录)时,ODBCResultSet就认为数据集已经到头了,下面的记录就都丢了。于是使用关系数据库软件打开数据库,并将其中的字段减少若干条后,就可以一次读取出全部3000多条记录。至于需要减少多少个字段才能一次读取出全部记录跟原先的关系型数据库的结构有关,需要具体情况具体实验,没有定论。但是可以肯定的一条是Notes本身确实为每个对象类都设置了缓存;并且Notes能根据当前内存的使用情况改变缓存的大小。其次,当用户开机后不是马上运行Lotus Notes而是先运行一个其他的程序,然后再运行Notes时,上面提到的第3328条数据库记录就有所改变,可能变为第3112条记录,也可能变为第3218条记录,这个数字将变得不唯一,具体是多少不得而知,而是与所运行的应用程序有关。
---- 上述代码实现了通过ODBC数据源读取关系数据库中的内容写到Lotus Notes库,同样也可以使用上述方法实现在Lotus Notes 程序通过ODBC 数据源写回到关系数据库的功能,具体实现方法与上面的过程大同小异,因此只在此附上源代码:
(1) Option 事件中:
Uselsx "*lsxodbc"
(2) Clicked 事件中:
Sub Click(Source As Button)
Dim session As NotesSession
Dim db As NotesDataBase
Dim dc As NotesDocumentCollection
定义程序中用到的对象类
Set session = New NotesSession
Set db = session.CurrentDataBase
取到当前数据库的信息
Dim con As New ODBCConnection
Dim qry As ODBCQuery
Dim result As ODBCResultSet
定义ODBC对象类
Set qry = New ODBCQuery
Set result = New ODBCResultSet
If con.ConnectTo("test") Then
Set qry.Connection = con
Set result.Query = qry
qry.SQL = "SELECT * FROM table1"
Call result.Execute()
Set dc = db.AllDocuments
// 得到当前数据库中所有文档的文档集
If dc.Count = 0 Then
// 如果文档集为空,则直接退出
result.Close(DB_CLOSE)
con.Disconnect
Exit Sub
End If
For i = 1 To dc.Count // 循环,
直到所有文档都被写入关系库
Set doc = dc.GetNthDocument(i)
// 获得第i条文档
Call result.AddRow()
// 在关系库中增加一条记录
Forall j In doc.Items
Dim str_name As String
Dim value As Variant
str_name = j.name
If (str_name < > "FORM")
And (str_name < > "$UpdatedBy") Then
// Notes为每个文档都增加了两个特殊的
NotesItem对象用于标识系统信息
value = doc.GetItemValue(str_name)
Call result.SetValue(str_name,value(0))
// 为关系库中的字段赋值
End If End Forall
result.UpdateRow // 更新关系库
Next
result.Close(DB_CLOSE)
con.Disconnect
Else
Messagebox("Could not connect server")
End If
End Sub
二. Lotus Domino 中的日期处理
---- 在使用ODBC族对象类与关系数据库进行交互的代码里,有下面一段:

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日”。为什么会出现这个日期,目前尚不得而知。但是在Lotus Script中由于没有单独的Date数据类型,所以Notes的日期变量是以8个字节的浮点数的形式存在的,其整数部分表示公元某年某月某日,其小数部分表示小时分秒,从午夜开始计数。

---- 其日期类型可以表示的范围从公元100年1月1日(-657434),到9999年12月31日(2958465)这一天,然后Notes会把9999年12月31日对应的整数日期以及所有超过上述日期范围的日期都换算成1899年12月30日。Notes为什么会用这种方法处理日期型变量,以及为什么把1899年12月30日作为无法换算日期的默认值这一点目前还没有比较好的解释,但是作为一个数据库转换程序,应该保证转换前后的两个数据库中内容的一致性,因此由于Notes本身没有解决这个问题那么就只能由程序来解决。解决的思想是:如果取出来的日期型变量的值为空,那么就应该向Notes库中写入空日期,于是就有了上面的代码。

---- 在代码中,使用到了一个DateValue(string)函数,此函数的功能是将字符串参数转换成日期数据类型,如果字符串所表示的内容找不到合法的日期数据与之对应,那么此函数将保留字符串的值不变,而仅仅把其数据类型转换成日期型,即实现了强制类型转换函数的功能。而代码中的“0:00:00”字符串是个特殊字符串,在通过ODBC数据源读取关系数据库的记录时,如果关系库中的日期型字段值为空,那么取出的值就是“0:00:00”形式的日期(这也许与Microsot公司的ODBC驱动及相关程序有关,因为不只是Notes取出空日期为此值,其他软件甚至包括微软自己的MS Query组件通过ODBC读取同一关系数据库中的日期型变量时也会出现同样的问题)。使用DateValue(“0:00:00”)语句就可以判断取出的日期型变量的值是否为空,如果为空则将变量Value的值赋成空字符串,然后再写入Notes库中,则可避免出现1899年12月30日这个特殊日期。

---- 虽然Lotus Script中没有提供专门的日期数据类型,但是Lotus却提供了NotesDateTime对象类,其中包括了日期数据的相关处理,如果开发者必须要在程序中处理日期数据而又觉得Lotus Script提供的函数不够的话,可以考虑使用NotesDateTime对象。

---- 三. Notes中视图与表单的关联

---- 在开发过程中,由于一次错误意外地发现了Notes中视图与表单的关联技巧。Notes为每个表单都设置了名称与别名两个属性,这两个名字都能标识表单。在开发过程中,所开发的库有两个表单,分别命名为Form1和Form2,其各自的别名由于疏忽都设成了Document,而每个表单都有一个视图与之对应,在设计Form2的视图时,虽然指定视图中的列都与Form2中的域相关联,但是在运行的时候从视图中双击某条文档欲对其进行编辑时,切换到的表单却是Form1的,多方查找均不能解决这个问题,于是报着试试看的心理改变了表单的别名,分别为Document1和Document2,问题解决。但是又从出现Form1的视图无法切换到表单的情况,于是又将Form1的别名改回Document,两个视图均能正确切换到自己的表单上。

---- 由此发现,Notes在建立视图与表单的关联的时候,首先看表单是否具有别名,如果有,则用别名进行关联,一旦对表单的别名进行了改变就得重新设计视图,如果不想重新做视图就不能改变表单的别名。当然同时也可以应用这一技巧实现从视图中切换到不同表单的功能。如果表单没有别名,则使用名字进行关联。


摘 要 本文基于MicroSoft的开放数据库互连技术,介绍了Lotus Notes中激活ODBC的基本方法并给出了一个将关系型数据库信息转换到NOTES数据库的实例。

关键词 ODBC、DBMS、@DB、ODBCConnection、ODBCQuery 、ODBCResultSet
引言 自从1989年12月6日,莲花发展公司(LOTUS DEVELOPMENT CORP .)发表了Lotus Notes,一种能极大改进公司内部、与其他公司及客户之间的环球通讯、协同工作和协调一致的软件产品。由于它有很好的电子邮件系统,领先的全文检索和复制功能,还具有极强的安全措施,可以可*地保证安全性,因而得到广泛的应用。
但它也有自身的弱点,在联机事物处理问题,比如:数据统计、分析、图表生成等功能上还很弱,这时就需要传统的关系型数据库管理系统来实现。如何把现有的关系型数据库信息转换到Notes数据库中,以便利用Lotus Notes中的许多良好性能共享数据库,是本文要讨论的问题。
ODBC概述 ODBC(OPEN DATABASE CONNECTIVITY 开放数据库连接)是微软开放的服务结构(WOSA:MicroSoft Windows Open Service Architechtrue)中有关数据库的一个组成部分,它规定“以统一的API存取异构数据库信息”是对SQL ACCESS GROUP的CLI标准的一种实现,得到了世界上领先的数据库和应用程序开发商的广泛支持。通过使用这统一的API建立的应用程序,对数据库的操作不依赖于任何数据库管理系统,不直接与任何DBMS(数据库管理系统)打交道,从而直接实现应用程序对不同DBMS的共享。
采用ODBC技术,应用程序只需关心数据的处理而不必考虑数据的存取,编程人员不必了解具体的DBMS,从而极大地减少了软件开发人员的工作量,缩短了开发周期,提高了效率和软件的可*性。
3 ODBC工作原理
ODBC接口以SQL作为标准的查询语言来存取连接到的数据源。ODBC允许单个应用存取多个不同的数据库管理系统,这使得应用开发者可以开发、编辑和发行应用而不管它操作的数据库管理系统(DBMS)究竟是什么。用户可以通过加载连接到不同数据库的驱动程序来建立与各种数据库的连接。
一般说来,ODBC调用由四个层次组成:
第一层为ODBC应用软件,它通过调用ODBC函数给数据库发送SQL语句并处理SQL返回结果。LOTUS NOTES 是通过NDODBC完成这一功能的。
第二层为驱动管理软件。驱动管理器管理驱动程序和装载驱动程序,它的作用如下:
用ODBC.INI文件映射数据源名到特定的驱动程序;
处理几个ODBC初始化调用;
给每个驱动程序提供ODBC函数入口点;
对ODBC的调用参数和顺序进行检验。
第三层为驱动软件。处理ODBC函数调用,提交SQL请求到特定的数据源并返回结果给应用。如果必要,它会修改应用的SQL请求,以使SQL请求的写法与物定数据库的语法一致。
第四层是数据源。数据源是指要存取的数据及相关的操作系统、数据库管理系统和网络系统。
ODBC接口支持的SQL语句 事实上,ODBC驱动(第三层)程序有两类,一类含有SQL语句处理功,另外一类则没有。
因此,我们可以看到,对不含SQL处理功能的ODBC驱动来说(如SYBASE的ODBC驱动),应用中可以使用的SQL语句就是数据源数据库(如SYBASE)支持的SQL语句,那么,含有SQL处理功能的ODBC驱动(如dBASE的ODBC驱动)支持哪些SQL呢?
这类ODBC驱动有两部分内容,一类是处理所支持ODBC函数调用的应用程序接口(如API、APPLICATION PROGRAM INTERFACE),另一类是处理所支持SQL语句及SQL数据类型的SQL处理程序(SQL GRAMMER)。API按其功能大小分为三级:
4.1第一级(Core):含有X/OPEN和SAG CLI规定的API函数集合。
4.2第二级(Level 1):含有第一级的所有API函数,并且还有一些扩展函数。
4.3第三级(Level 2):含有第一级和第二级的所有API函数,并且还再有一些扩展函数。
LotusNotes 4.5版本要求ODBC驱动的API至少支持到第二级。
建立ODBC数据源 Lotus Notes使用ODBC标准存取异种数据库信息。通过Notes里内嵌的公式或Script语言,您可以在Notes文档中引入非Notes信息,可把现成的数据转换成Notes数据库。在存取外部数据之前,您必须先定义一个数据源,以便让ODBC 驱动程序管理器知道怎样获取数据。一个数据源把一个特定的ODBC驱动程序和要存取的数据库联系在一起,并包括您想存取的数据,它与服务器或目录、后台DBMS(数据库管理系统)以及网络平台相联系,这些信息都记录在一个注册文件中(在Windows95中是ODBC.INI),可采用Windows的管理工具注册数据源。ODBC驱动程序管理器负责将应用程序的SQL语句以及其他的信息传递给驱动程序;而驱动程序则负责将结果集传回应用程序。在WINDOWS95中的操作步骤如下:
打开WINDOWS控制面板;
②按下ODBC图标;
③按下ADD按钮;
④选择您需要的驱动程序,按下OK按钮;
⑤输入数据源名称、描述信息,以及所需要的信息;⑥有些驱动程序还需要其他的一些信息,输入这些必要的信息,并按下OK按钮
⑦按下CLOSE按钮。
使用函数通过ODBC访问异种数据库 在LOTUS NOTES 4.5版本中提供了三个函数访问异种数据库,并返回一个值或列表值:
●@DBCOLUMN(ODBC)返回表格中一列的全部数组,或者全部不同的数值;
●@DBLOOKUP(ODBC)返回在表格中一列通过匹配关键字选定的数值;
●@DBCOMMAND(ODBC)传递一个命令到外部DBMS并返回结果;
其中@DBCOLUMN、@DBLOOKUP都只能提取数据,它们不能增加、删除、修改数据,或执行其他操作;@DBCOMMAND能恢复数据或发送其他可以改变数据的SQL语句;
下面给出它们的标准形式:
@DbColumn(“ODBC”:“NoCache”;data_source;
user_ID1:user_ID2;pass_word1;password2;
table;column:null_handling;”Distinct”:sort)
@DbLookup(“ODBC”:”NoCache”;”data_source”;
”user_ID1”:”user_ID2”;”password1”;
”password2”;”table”;”column”:“null_handling”;
”key_column”:”key”;”Distinct”:sort)
@DbCommand(“ODBC”:”NoCache”;data_source;user_ID1:user_ID2;
pas_sword1;password2;command_string:null_handling)
注意:如果用户的NOTES。INI文件有下列语句:
NoExternalAPP=1
则所有公式被禁止,并且看不到任何错误信息,公式不能执行。
通过ODBC使用LotusScript访问外部数据库 LSX兼容模块允许您使用LotusScript语言来编写存取外部数据的程序,Notes的ODBCConnection、ODBCQuery、ODBCResultSet三个类为Notes提供了用ODBC标准存取外部数据库的属性和操作。
记住,您必须把下面的语句放置在(GLOBAL)对象的(OPTIONS)事件中才能访问ODBC类:
USELSX“*LSXODBC”
ODBCCONNECTION类 代表了与数据源连接的ODBC DATA ACCESS特性;
ODBCQUERY类 代表定义一个SQL语句的ODBC数据库存取特性,一个查询在被使用或者有效确认之前,必须从属与一个有效的连接
ODBCRESULTSET类 代表在集合上执行操作的ODBC数据存取特性
8 由关系型数据库转换成NOTES数据库的一种实现方法
下面以Notes访问Foxpro数据库为例,介绍Notes访问异种数据库的一种实现方法。
基本编程思路是:对Foxpro的一个数据库,按其基本结构相应在Notes数据库里建立一个同样结构的表单,以便把Foxpro某个字段的信息经转换后存在Notes表单相应字段中,建立一个操作,用Lotus Notes语言编写转换程序,在视图中运行,以实现外部数据库信息向Notes数据库转换。
假定Foxpro的一个数据库(SU97.DBF),其结构如下:
字段名 类型 宽度
ORDINAL N 4
COMTIME D 8
COMWORD C 18
COMNO C 3
RECETIME D 8
RECEWORD C 18
RECENO C 3
RECEDEPA C 24
RECETITL C 120
SECLEV C 4
HANDLE C 12
THEME C 48
REMARK C 60
TODEPA C 40
ENDDEPA C 40
欲将此数据库所有信息转换到NOTES库中,实现步骤如下:
8.1在NOTES中新建一个数据库,取名为ODBC.NSF,在这个数据库里创建一个表单,取名为TEST_ODBC,其内容如下:
域 名 类 型 说 明
XUHAO 数 字 可 编 辑
SHOUWENSHIJIAN 时 间 可 编 辑
SHOUWEIZI 文 本 可 编 辑
SHOUWENHAO 文 本 可 编 辑
LAIWENSHIJIAN 时 间 可 编 辑
LAIWENZI 文 本 可 编 辑
LAIWENHAO 文 本 可 编 辑
LAIWENJIGUAN 文 本 可 编 辑
LAIWENBIAOTI 文 本 可 编 辑
MIJI 文 本 可 编 辑
BANFUQINGKUAN 文 本 可 编 辑
ZHUTICI 文 本 可 编 辑
SONGBANDANWEI 文 本 可 编 辑
WANCHENGDANWEI 文 本 可 编 辑
在ODBC.NSF数据库中建立一个标准视图,取名为TESTVIEW,定义该视图选项为SELECT (form=”test_odbc”);同时创建一个操作,标题为“转换”,在CLICK事件中作如下编程:
Sub Click(Source As Button)
Dim session As New notessession
Dim db As notesdatabase
Dim doc As notesdocument
Dim view As notesview
Dim r As Integer
Dim con As New odbcconnection
Dim qry As New odbcquery
Dim result As New odbcresultset
Set db=session.currentdatabase
Set view=db.getview("testview")
If con.connectto("Foxpro25") Then
Set qry.connection = con
,发出查询请求
qry.sql="select *from su97"
Set result.query = qry
If Not result.execute() Then
Messagebox("error:" &_
result.geterrormessage(db_lasterror))
End If
columns=result.numcolumns
Do
Call result.nextrow()
Set doc= New notesdocument(db)
Doc.form=“test_odbc”
,取出结果集并存入相应字段中
doc.xuhao=result.getvalue(1)
doc.shouwenshijian=result.getvalue(2)
doc.shouwenzi=result.getvalue(3)
doc.shouwenhao=result.getvalue(4)
doc.laiwenshijian=result.getvalue(5)
doc.laiwenzi=result.getvalue(6)
doc.laiwenhao=result.getvalue(7)
doc.laiwenjiguan=result.getvalue(8)
doc.laiwenbiaoti=result.getvalue(9)
doc.miji=result.getvalue(10)
doc.banfuqingkuan=result.getvalue(11)
doc.zhutici=result.getvalue(12)
doc.beizhu=result.getvalue(13)
doc.songbandanwei=result.getvalue(14)
doc.wanchengdanwei=result.getvalue(15)
Call doc.save(True,False)
Loop Until result.isendofdata
,与数据库断开联系
Call con.disconnect()
Else
Messagebox("could not connect to server")
End If
End Sub
8.2在视图中点击“转换”按钮,就可以将FOXPRO中数据库(SU97。DBF)的信息一次转换到NOTES数据库了。
以上方法已在机器上调试通过,运行环境为:WINDOWS98,LOTUS NOTES CLIENT4.61,联想PII/400,32M内存。


====================================

Dim con As New ODBCConnection
Dim qry As New ODBCQuery
Dim result As New ODBCResultSet

Set qry.Connection = con
Set result.Query = qry


flag=con.ConnectTo("用户数据源名称","SQL用户名","密码",,"数据库"

If flag = False Then
Msgbox "无法连接SQL SERVER数据库,请与系统管理员联系!"
Exit Sub
End If

qry.SQL = "SELECT * FROM 表单名"

result.Execute

'增加一行
result.AddRow

result.SetValue("字段名",Doc.相关域名(0))

result.SetValue("字段名",Doc.相关域名(0))

result.SetValue("字段名",Doc.相关域名(0))

'更新
result.UpdateRow


'关闭连接
result.Close(DB_CLOSE)
'断开连接
con.Disconnect

===============================================================

如何使用Notes与关系数据库进行信息交互


在Notes环境下,可通过公式、函数和Script与其他关系数据库进行信息交互。
一、设置ODBC数据源
Notes可通过ODBC驱动程序访问关系数据库。
1、在操作系统的控制面板中,打开“ODBC数据源”。
2、在“用户DSN”中单击“添加”,增加一个新的数据源。
3、选择数据源的驱动程序。
4、定义数据源等驱动参数。

二、利用Script读取数据库
注意:使用LotusScript访问数据库一定要在(Options)过程中加入Uselsx "*LSXODBC"命令
On Error Goto err '如果有错误,就转到相应错误处理程序

Dim con As New ODBCConnection '定义ODBC连接对象
Dim qry As New ODBCQuery '定义ODBC查询对象
Dim result As New ODBCResultSet '定义ODBC结果处理对象

Set qry.Connection = con '将ODBC查询对象和相应连接对象挂*
Set result.Query = qry '将ODBC查询对象和相应结果处理对象挂*

con.ConnectTo("ABC") '使用ODBC数据源ABC连接上相应数据库
qry.SQL = "SELECT * from test" '定义ODBC查询对象所使用的查询SQL语句
result.Execute '执行该SQL语句

rows = result.MaxRows '返回结果记录数
Call result.FirstRow '定位第一条记录

Do
a1 = result.GetValue("1") '获得该条记录1字段中的值
a2 = result.GetValue("2") '获得该条记录2字段中的值
Print a1,a2 '将返回的值,打印显示
Call result.NextRow '继续下一条记录
Loop While maxrow > result.CurrentRow '如果搜索到最后条记录,退出循环

result.Close(DB_CLOSE) '关闭结果集
con.Disconnect '断开数据库连接
Exit Sub

errorHandler:
Messagebox result.GetExtendedErrorMessage,, result.GetErrorMessage '显示发生错误的消息
Exit Sub

三、利用Script写入数据库
On Error Goto err '如果有错误,就转到相应错误处理程序

Dim con As New ODBCConnection '定义ODBC连接对象
Dim qry As New ODBCQuery '定义ODBC查询对象
Dim result As New ODBCResultSet '定义ODBC结果处理对象

Set qry.Connection = con '将ODBC查询对象和相应连接对象挂*
Set result.Query = qry '将ODBC查询对象和相应结果处理对象挂*

con.ConnectTo("ABC") '使用ODBC数据源ABC连接上相应数据库
qry.SQL = "SELECT * from test" '定义ODBC查询对象所使用的查询SQL语句
result.Execute '执行该SQL语句

result.AddRow '增加一行记录

Call result.SetValue("1","AA") '给该记录字段1赋值"AA"
Call result.SetValue("2",3) '给该记录字段2赋值3

result.UpdateRow '将增加的记录写入数据库
result.Close(DB_CLOSE) '关闭结果集
con.Disconnect '断开数据库连接
Exit Sub

errorHandler:
Messagebox result.GetExtendedErrorMessage,, result.GetErrorMessage '显示发生错误的消息
Exit Sub

qry.sql = "insert into table1(namber,name1,age,xingbie) values('" + a + " ','" + b + " '," +")"


 

转载于:https://www.cnblogs.com/hannover/archive/2009/12/03/1616616.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是俺学习参考别人有关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、付费专栏及课程。

余额充值