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下均工作正常。

相关文章推荐

LotusNotes访问关系数据库的方法

  • 2013年12月20日 09:44
  • 35KB
  • 下载

vb 数据库操作(写入、读取)

  • 2017年11月14日 14:00
  • 97KB
  • 下载

VB操作access数据库

第一次用VB来连接数据库,由于不了解VB语法,费了

数据库与VB6.0程序操作连接

  • 2011年06月24日 17:33
  • 23KB
  • 下载

vb.net 操作Access数据库帮助类

VB.net 操作Access数据库的一些常用方法,代码如下 Imports System Imports System.Data.SqlClient Imports System.Config...
  • lqh4188
  • lqh4188
  • 2013年12月29日 11:30
  • 5221

VB.NET 使用 OleDb 操作 Access 数据库(来自 MSDN)

VB.NET 使用 OleDb 操作 Access 数据库 这里采用 OleDb 方式对 Access 数据库进行访问,主要内容都来自 MSDN 帮助文档。建议新手注意 MSDN 的用途。 首先导入命...
  • Linmson
  • Linmson
  • 2014年04月03日 13:52
  • 5145

vb.net数据库异步操作(二)

‘进行详细说明Imports System.Data.SqlClient Imports System.Threading Module Program Sub Main() ...

VB.NET操作ACCESS数据库读取存入图片

一、准备工作     在ACCESS数据库中,将字段声明为 OLE链接 类型 二、将图片框中图片转化成二进制数组的方法         Dim MyStream As New System.IO....

vb.net 数据库访问操作

Imports System.Data Imports System.Data.SqlClient Namespace DA     Public Class DBConnector     ...
  • memkqy
  • memkqy
  • 2014年08月04日 21:55
  • 281

VB通过代码对Access数据库的操作

转csdn帖子中faysky2、lihonggen0的答案,不过自己还未测试,先记录下来 用ADOX:  '菜单“工程”--> "引用 "--> Microsoft ADO ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB操作LotusNotes数据库
举报原因:
原因补充:

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