利用ODBC實現Domino和關聯式資料庫的互操作 (轉)

worldblog發表於2007-12-10
利用ODBC實現Domino和關聯式資料庫的互操作 (轉)[@more@]

利用OC實現ino和關係的互操作

  Lotus Domino是當今辦公自動化的主流開發平臺之一,Domino自帶一個非關係型資料庫——文件型資料庫,而目前大部分企業的資訊都儲存在諸如 SERVER等關係型資料庫中,因此,在開發辦公自動化系統過程中勢必要涉及Domino和關聯式資料庫的資料問題。


  一、Lotus Domino與關聯式資料庫的互操作


  在Lotus Domino R5中提供了三個Lotus Notes擴充套件類:ODBCConnection(ODBC連線)、ODBCQuery(ODBC查詢)以及ODBCResultSet(ODBC結果集)。應用這三個類並輔以Lotus Script語言就能實現與關聯式資料庫的互操作問題。

  具體解決方法如下:

  第1步:在控制皮膚→32位ODBC資料來源中建立資料來源Test;

  第2步:在Domino R5中新建一個資料庫Try,並建立一個空白表單Con-nection,此表單沒有任何內容,然後在表單上建立一個“操作”,起名為“Read”;

  第3步:在“Read”操作的視窗中選擇程式語言為Lotus Script;

  第4步:在程式設計視窗的視窗中點選“Option”事件,並寫入如下指令碼:

  Uselsx "?lsxodbc" // 使用Lotus Script 擴充套件ODBC類

  第5步:選中“Declare”事件,在其中寫入:

  Dim session As NotesSession

  Dim db As NotesDataBase

  Dim doc As NotesDocument

  Dim qry As ODBCQuery

  Dim result As ODBCResultSet

  Dim con As ODBCConnection

  第6步:選中“Click”事件,在其中寫入:

  Sub Click( As Button)

  ′ Set New Value

  Set session=New NotesSession

  Set con=New ODBCConnection

  Set qry=New ODBCQuery

  Set result=New ODBCResultSet

  ′ Get Current Database

  Set db=session.CurrentDataBase

  Set doc=New NotesDocument(db)

  doc.form="connection"

  Call con.Dinnect()

  If con.ConnectTo("test") Then

   Set qry.connection=con

   qry.SQL=" ? FROM Table1"

   Set result.Query=qry

   Call result.Execute()

   columns=result.Columns

   Do

   Call result.NextRow()

   For i=1 To result.Numcolumns

   field=result.FieldName(i)

   value=result.GetValue(field)

   If Isdate(value) Then

   If value=Datevalue("0:00:00") Then

   value=" "

   Else

   value=Format(value,"mm-dd-yyyy")

   End If

   End If

   Set item=doc.AppendItemValue(field,val-ue)

   Next

   Call doc.save(True,True)

   Set db=session.CurrentDataBase

   Set doc=New NotesDocument(db)

   doc.form="test"

   L Until result.IsEndOfData

   Call con.Disconnect()

   Else

   Messagebox("Could not connect to server")

  End If

  End Sub

  

  最後,儲存表單並執行,用滑鼠點選Read操作後,關聯式資料庫中的內容就被取到Notes的文件型資料庫中了。


  二、存在的問題及解決


  但是使用上面的程式碼在進行實際資料庫內容轉換的時候,我們發現Notes 透過ODBC資料來源連線關聯式資料庫時,無法識別中文欄位名。如果關聯式資料庫的欄位是中文名字,那麼ODBCResultSet將為空,解決的辦法是將關聯式資料庫中的所有欄位都改為英文名字。

  在實際資料庫的轉換過程中同時發現的問題還有:該程式完一次後不能把關係型資料庫中的內容全部取出來。透過Lotus Script指令碼並多次單步跟蹤指令碼的執行情況,發現每次都是執行到同一條資料庫記錄時,ODBCRe-sultSet就認為資料集已經到頭了,下面的記錄就都丟了。於是使用關聯式資料庫開啟資料庫,並將其中的欄位減少若干條後,就可以一次讀取出全部記錄。至於需要減少多少個欄位才能一次讀取出全部記錄跟原先的關係型資料庫的結構有關,需要具體情況具體實驗。


  三、Lotus Domino中的日期處理


  上面程式中有如下一段程式:

  If Isdate(value) Then

   If value=Datevalue("0:00:00") Then

   value=" "

   Else

   value=Format(value,"mm-dd-yyyy")

   End If

   Set item=doc.AppendItemValue(field,value)

  End if

  這一段程式碼的作用是:判斷從關係庫中讀取出來的欄位是否為日期型欄位,如果是,那麼判斷此日期型欄位的值,看它是否為空,如果為空則在寫入Notes庫的時候做處理,保證寫入的是空日期型別,如果此欄位的值不為空則直接寫入Notes庫;如果此欄位不是日期型欄位,則不做任何處理。

  若是不做上述處理,那麼透過ODBCResultSet類取出的日期型欄位的值如果為空,則寫入Notes庫的時候不知什麼原因會寫入“1899年12月30日”這個日期。

  在程式碼中,使用到了一個DateValue(string),此函式的功能是將字串引數轉換成日期資料型別,如果字串所表示的內容找不到合法的日期資料與之對應,那麼此函式將保留字串的值不變,而僅僅把其資料型別轉換成日期型,即實現了強制型別轉換函式的功能。而程式碼中的“0:00:00”字串是個特殊字串,在透過ODBC資料來源讀取關聯式資料庫的記錄時,如果關係庫中的日期型欄位值為空,那麼取出的值就是“0:00:00”形式的日期。使用DateValue(“0:00:00”)語句就可以判斷取出的日期型變數的值是否為空,如果為空則將變數Value的值賦成空字串,然後再寫入Notes庫中,就可避免出現“1899年12月30日”這個日子了。


  四、NotesItem


  NotesItem是可以代表所有表單元素的物件,簡單地說就是所有可放置在表單上的元素,在Lotus Script程式中都可以用NotesItem物件表示並對其進行操作。上面程式碼中的doc.AppendItemValue(fieldname,value)函式的作用就是根據Value的值為表單追加域(也就是關係庫中的欄位)。

  其實細心的讀者一定已經發現了,在上面關於空日期的處理程式碼中,為什麼要先把Value的值賦成空,然後再寫入庫中呢?為什麼不可以直接往庫裡寫值呢?問題的關鍵就在NotesItem上。

  NotesItem有很多屬性,其中最重要的兩個是Name和Text屬性。Name屬性存放表單元素的名稱(即fieldname),而Text屬性存放表單元素的值(value)。在程式執行到doc. AppendItemValue(fieldname,value)函式的時候,Notes將域名(fieldname)和相對應的值(value)寫到NotesItem物件中。執行Call doc.Save()函式之後,所有中的NotesItem物件被存入相關聯的表單中。

  在研究如何處理空日期的過程中,最初的想法是直接將空字串寫入NotesItem中,但是在檢視幫助並單步跟蹤指令碼的執行後發現上述方法行不通。原因在於NotesItem的Text屬性是隻讀的,根本無法為其賦值,同時也沒有相應的賦值函式,顯然函式doc.AppendItemValue(fieldname,value)是專門給Text屬性賦值的函式。


  五、Notes中檢視與表單的關聯


  在開發過程中,由於一次錯誤,我們意外地發現了Notes中檢視與表單的關聯技巧。Notes為每個表單都設定了名稱與別名兩個屬性,這兩個名字都能標識表單。在開發過程中,我們所開發的庫有兩個表單,分別命名為Form1和Form2,其各自的別名由於疏忽都設成了Docu-ment,而每個表單都有一個檢視與之對應。在設計Form2的檢視時,雖然指定檢視中的列都與Form2中的域相關聯,但是在執行的時候從檢視中雙擊某條文件欲對其進行編輯時,切換到的表單卻是Form1的,多方查詢均不能解決這個問題,於是抱著試試看的心理改變了表單的別名,分別為Document1和Docu-ment2,結果問題解決。但是又出現了Form1的檢視無法切換到表單的情況,於是又將Form1的別名改回Document,兩個檢視均能正確切換到自己的表單上了。

  由此發現,Notes在建立檢視與表單的關聯的時候,首先看錶單是否具有別名,如果有,則用別名進行關聯,一旦對錶單的別名進行了改變就得重新設計檢視,如果不想重新做檢視就不能改變表單的別名。當然同時也可以應用這一技巧實現從檢視中切換到不同表單的功能。如果表單沒有別名,則使用名稱進行關聯。 


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

相關文章