VB操作LotusNotes数据库 |
今日,异构数据环境已经是一个 广泛存在的问题,Windows常用开放数据库互连 标准ODBC进行数据 交换与操作,后来微软又推出了ADO技术,例如用VB操作Oracle、Sybase和SQLServer等,其 利用也越来越 广泛 。 办公自动化软件中常用的数据库系统LotusNotes,属于非关系数据库治理系统 。 存在以下特色: 1.基于文档组织模式; 2. 使用非 构造化的数据元素; 3.通过定时复制刷新数据; 4. 使用视图定位数据; 5.通过全文检索 拜访数据 。 由于ADO或ODBC的 步骤是针对Oracle等关系数据库治理系统的,重要是通过SQL语言 拜访数据,Notes 只管也提供了NotesODBC,但它并不 支撑全文检索, 因此要在VB中实现对LotusNotes数据库的存取,必须通过别的 步骤 。 在Notes中 使用COM和OLE OLE是Windows的一个 特色,OLE通过把 利用程序的 性能作为对象 袒露给 其余 利用程序,这些对象 占有属性(数据)和 步骤(函数), 利用程序通过OLE中的对象去执行相应的 使命 。Domino既 可以作为一个OLE提供应外部程序调用,也 可以通过OLE去操纵 其余OLE对象 。 只管OLE也有许多 长处,但Domino的OLE服务不 支撑早期绑定,这 象征着在VB等 利用程序中对OLE编程进行类型 审查、 快捷启动时,DominoOLE将 胁迫 利用程序启动Notes的客户端,从而对系统产生 硕大压力 。此外, 利用程序不能同时启动多个NotesSession,重要出于安全角度,Domino的OLE不同意 利用程序直接输入消费者名和密码, 因此整个 利用程序要么频繁地启动和关闭DominoOLE来 打开NotesSession,要么大量 使用全局变量,对程序设计极为不利 。 在R5.03以后,Lotus提供了一个 后盾的COM类NotesSession 。NotesSession是一个 性能 壮大的对象模型,它提供了 其余Notes对象的接口,即惟独通过它 威力 拜访Notes中的数据库对象NotesDatabase、NotesView等对象 。 由于COM与OLE的兼容性, 因此,用VB等程序操作Domino就变得相当方便,在VB中 引用的 步骤十分 方便,新建一个工程,在菜单“工程”下 取舍“ 引用”,则会浮现下列对话框: 新建工程时加入对Domino库的 引用 同时在Form上放一个FlexGrid控件,产生一个如图2所示的窗体 。在窗体事件Load中键入下列代码: 窗口界面 PrivateSubForm_Load() DimSessionAsNewDomino.NotesSession DimPublicNotesDbAsNewDomino .NotesDatabase DimViewAsNotesView DimCAsNOTESVIEWCOLUMN DimMycountAsInteger Session.Initialize SetPublicNotesDb=session.GetDatabase(“教科文处/教科文”,“档案治理.nsf”) IfPublicNotesDbIsNothingThen MsgBox(“不能 打开Notes库,请查看系统设置!”) EndIf SetView=PublicNotesDb.GetView(“HavingAutoCode”) WithgrdDataGrid .Clear j=0 .Rows=2 .FixedCols=1 .FixedRows=1 .Col=1 .FixedRows=.Row .Row=0 .Cols=2 j=1 ForEachCInView.Columns .AddItem(C.Title) x.Caption=C.Title .Col=j .Cols=.Col 2 .Item(j).Visible=False .Text=C.Title IfC.IsHidden=TrueThen .ColWidth(j)=0 EndIf j=j 1 Next .Cols=j 3 .Col=j .Text=“ 解决状况” .Col=j 1 .Text=“ 解决缘由” .Col=j 2 .Text=“ 解决责任人” .ColWidth(2)=1800 .ColWidth(3)=1800 DimDocAsObjectNOTESDOCUMENT SetDoc=View.GetFirstDocument .Row=1 j=1 DimStrAsString DoUntilDocIsNothing .Col=1 .Text=Doc.GetItemValue(“ 注销号”)(0) .Col=2 Str=Doc.GetItemValue(“组卷号”)(0) .Text=Str .Col=3 .Text=Doc.GetItemValue(“文件字号”)(0) .Col=4 .Text=Doc.GetItemValue(“文件名”)(0) SetDoc=View.GetNextDocument(Doc) IfNotDocIsNothingThen Ifj>=.RowsThen .Rows=j 1 EndIf .Row=j;j=j 1 EndIf Loop .MergeCells=flexMergeRestrictColumns 'MergeCells=2 .MergeCol(0)=True .MergeCol(1)=True .MergeCol(2)=True .MergeCol(3)=True .Redraw=True EndWith EndSub 上面的代码中,调用initialize 步骤产生一个NotesSession对象,它的 步骤有点 类似VBA中调用Word的 步骤,假如采纳IsOpen 可以推断是不是已经 打开对话框,函数GetDatabase() 打开Notes数据库,其中 获得一个数据的函数用法有点特殊: .Text=Doc.GetItemValue(“ 注销号”)(0) 使用两个延续的括号 仿佛VisualBasic不同意,其实Domino中同意多值域,所以函数GetItemValue()返回的 本质上是一个数组,第一个元素从0开始 。 按键盘F5开始运行,就 可以看到输出 后果 。 VB操作DominoCOM的优缺陷 VB操作DominoCOM 存在以下 长处: VB 利用程序不需求调用LotusNotes客户端就 可以 拜访Notes的函数; 程序员 可以在设计时 使用早期绑定,其速度比晚绑定快,最重要的是 可以利用VB6的智能语法 揭示 性能; COM的运行速度比LotusScript快; 可以独立于LotusNotes客户端进行 利用程序 散发 。 遗憾的是Domino的COM与VBA等相比,还有一些显而易见缺陷: 当前Lotus只 支撑 后盾的Domino对象,即session,关于UIWorkSpace并不 支撑(假如 支撑,就 象征Lotus客户端 可以被消费者或第三方程序取代); 由于COM只被Windows所 支撑,当前Unix还不能 使用本文所 阐述的 步骤; 由于安全缘由,Louts当前不 支撑DCOM技术; Lotus提供的COM并不 支撑“ref”内存指针, 标准COM提供三种内存指针:“ref”、“unique”和“ptr”,其中“ref”开销最小 。 论断 采纳COM作为VB与Domino的桥梁,既 可以 施展Domino的 壮大的文档 解决 威力,又 可以 施展VB 友爱的可视化 性能 。文中例子是小编实际工作中 使用过的,该设计采纳R5.05和VB6开发工具,在Win98、NT和Win2000下均工作 畸形 。 |