VB操作LotusNotes数据库

转载 2006年05月23日 20:07:00

今天,异构数据环境已经是一个普遍存在的问题,Windows常用开放数据库互连标准ODBC进行数据交换与操作,后来微软又推出了ADO技术,例如用VB操作Oracle、Sybase和SQL Server等,其应用也越来越普遍。

办公自动化软件中常用的数据库系统Lotus Notes,属于非关系数据库管理系统,具有以下特点:

1. 基于文档组织模式;

2. 使用非结构化的数据元素;

3. 通过定时复制刷新数据;

4. 使用视图定位数据;

5. 通过全文检索访问数据。

因为ADO或ODBC的方法是针对Oracle等关系数据库管理系统的,主要是通过SQL语言访问数据,Notes尽管也提供了Notes ODBC,但它并不支持全文检索,因此要在VB中实现对Lotus Notes数据库的存取,必须通过别的方法。

在Notes中使用COM和OLE

OLE是Windows的一个特征,OLE通过把应用程序的功能作为对象暴露给其他应用程序,这些对象拥有属性(数据)和方法(函数),应用程序通过OLE中的对象去执行相应的任务。Domino既可以作为一个OLE提供给外部程序调用,也可以通过OLE去控制其他OLE对象。尽管OLE也有许多优点,但Domino的OLE服务不支持早期绑定,这意味着在VB等应用程序中对OLE编程进行类型检查、快速启动时,Domino OLE将强迫应用程序启动Notes的客户端,从而对系统产生巨大压力。此外,应用程序不能同时启动多个NotesSession,主要出于安全角度,Domino的OLE不允许应用程序直接输入用户名和密码,因此整个应用程序要么频繁地启动和关闭Domino OLE来打开NotesSession,要么大量使用全局变量,对程序设计极为不利。

在R5.03以后,Lotus提供了一个后台的COM类NotesSession。NotesSession是一个功能强大的对象模型,它提供了其他Notes对象的接口,即只有通过它才能访问Notes中的数据库对象NotesDatabase、NotesView等对象。

由于COM与OLE的兼容性,因此,用VB等程序操作Domino就变得相当容易,在VB中引用的方法非常简单,新建一个工程,在菜单“工程”下选择“引用”,则会出现下列对话框:


新建工程时加入对Domino库的引用

同时在Form上放一个FlexGrid控件,产生一个如图2所示的窗体。 在窗体事件Load 中键入下列代码:


窗口界面

Private Sub Form_Load()

Dim Session As New Domino.NotesSession

Dim PublicNotesDb As New Domino

.NotesDatabase

Dim View As NotesView

Dim C As NOTESVIEWCOLUMN

Dim Mycount As Integer

Session.Initialize

Set PublicNotesDb = session.GetDatabase(“教科文处/教科文”, “档案管理.nsf”)

If PublicNotesDb Is Nothing Then

MsgBox (“不能打开Notes库,请查看系统设置!”)

End If

Set View = PublicNotesDb.GetView(“Having AutoCode”)

With grdDataGrid

.Clear

j = 0

.Rows = 2

.FixedCols = 1

.FixedRows = 1

.Col = 1

.FixedRows = .Row

.Row = 0

.Cols = 2

j = 1

For Each C In View.Columns

.AddItem (C.Title)

x.Caption = C.Title

.Col = j

.Cols = .Col + 2

.Item(j).Visible = False

.Text = C.Title

If C.IsHidden = True Then

.ColWidth(j) = 0

End If

j = j + 1

Next

.Cols = j + 3

.Col = j

.Text = “处理情况”

.Col = j + 1

.Text = “处理原因”

.Col = j + 2

.Text = “处理责任人”

.ColWidth(2) = 1800

.ColWidth(3) = 1800

Dim Doc As Object NOTESDOCUMENT

Set Doc = View.GetFirstDocument

.Row = 1

j = 1

Dim Str As String

Do Until Doc Is Nothing

.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)

Set Doc=View.GetNextDocument(Doc)

If Not Doc Is Nothing Then

If j >= .Rows Then

.Rows = j + 1

End If

.Row = j; j = j + 1

End If

Loop

.MergeCells = flexMergeRestrictColumns

'MergeCells = 2

.MergeCol(0) = True

.MergeCol(1) = True

.MergeCol(2) = True

.MergeCol(3) = True

.Redraw = True

End With

End Sub

上面的代码中,调用initialize方法产生一个NotesSession 对象,它的方法有点类似VBA中调用Word的方法,如果采用 IsOpen可以判断是否已经打开对话框,函数GetDatabase()打开Notes数据库, 其中取得一个数据的函数用法有点特别:

.Text = Doc.GetItemValue(“登记号”)(0)

使用两个连续的括号似乎Visual Basic不允许,其实Domino中允许多值域,所以函数GetItemValue()返回的实质上是一个数组,第一个元素从0开始。

按键盘F5开始运行,就可以看到输出结果。

VB操作Domino COM的优缺点

VB操作Domino COM具有以下优点:

● VB应用程序不需要调用Lotus Notes客户端就可以访问Notes的函数;

● 程序员可以在设计时使用早期绑定,其速度比晚绑定快,最主要的是可以利用VB6的智能语法提示功能;

● COM的运行速度比Lotus Script快;

● 可以独立于Lotus Notes客户端进行应用程序分发。

遗憾的是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下均工作正常。

VB6基本数据库应用(三):连接数据库与SQL语句的Select语句初步

同系列的第三篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/9455721。连接数据库与SQL语句的Select语句初步。这一章将介绍...
  • JiLuoXingRen
  • JiLuoXingRen
  • 2013年07月27日 03:40
  • 15359

VB6基本数据库应用(一):数据库基础

这是本套教程的第一课,讲述的是数据库结构的基础。学好数据库就必须了解清楚数据库的结构,其实并不困难。本套教程将从最基础的开始来讲述VB6的基础数据库操作。...
  • JiLuoXingRen
  • JiLuoXingRen
  • 2013年07月24日 17:14
  • 9868

详解VB中连接access数据库的几种方法

在VB中,连接ACCESS数据库的方法主要有下面三种      使用ADO对象,通过编写代码访问数据库                       Connection 对象...
  • GarfieldEr007
  • GarfieldEr007
  • 2017年03月26日 22:21
  • 806

VB6 用ODBC连接数据库

遇到的问题一:调用Dim hdbc As Long '连接句柄 rc = SQLAllocConnect(henv, hdbc) '获取连接句柄 MsgBox rc If rc 0 Th...
  • cf643487053
  • cf643487053
  • 2017年01月12日 16:13
  • 648

VB中对EXCEL的各种操作

全面控制 Excel 首先创建 Excel 对象,使用ComObj: Dim ExcelID as Excel.Application Set ExcelID as new Excel.Applica...
  • wzk456
  • wzk456
  • 2017年02月08日 15:20
  • 3927

VB与数据库的几种交互

vb与数据库的几种交互   1.使用ADO控件 首先需要在vb部件中添加ADO控件——属性     在此我们可以看到,有三种方式可以实现VB与数据库的连接。           1.data lin...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2013年06月14日 10:10
  • 2407

VB与数据库连接方式

VB与数据库的连接方式总的来说分为2种:有源连接、无源连接。其中的源指的是ODBC数据源。数据源类型可分为文件DSN、用户DSN\系统DSN三类。(OLE DB作为数据的提供者。)        有源...
  • qq_26545305
  • qq_26545305
  • 2015年08月13日 20:04
  • 1133

vb 操作xml方法总结

Private Sub xxx(ByVal xmlStr As String) ''初始化xml文档 Dim xmlDoc As New XmlDocument ...
  • yuewei19
  • yuewei19
  • 2014年12月11日 15:21
  • 2788

VB.net数据库编程(03):一个SQLserver连接查询的简单例子

这个例子,由于在ADO.net入门已经专门学了,再次进行复习 一下。 主要掌握连接字串的情况。 过程就是: 1、引用System.Data.SqlClient。而Access中引用 的是...
  • dzweather
  • dzweather
  • 2013年02月01日 18:52
  • 41349

VB查询数据库之写入数据库——机房收费系统总结(三)

在机房收费系统中,新注册的用户,更改的密码,上机下级记录,上机收费记录等等都要写入数据库,这样,后面的查询才能生效。像数据库中写入数据,首先,找到你要写入数据的数据库中的表,在表中建立新的行,让后再把...
  • lu930124
  • lu930124
  • 2013年11月30日 16:22
  • 3169
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB操作LotusNotes数据库
举报原因:
原因补充:

(最多只允许输入30个字)