End If
End Sub
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族对象类与关系数据库进行交互的代码里,有下面一段:
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
则所有公式被禁止,并且看不到任何错误信息,公式不能执行。