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下均工作 畸形 。