VB操作LotusNotes資料庫

genusBIT發表於2008-08-14

  今天,異構資料環境已經是一個普遍存在的問題,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下均工作正常。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14751907/viewspace-426969/,如需轉載,請註明出處,否則將追究法律責任。

相關文章