利用ODBC實現Domino和關聯式資料庫的互操作 (轉)
利用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關聯式資料庫之父 (轉)資料庫
- 主流關聯式資料庫鎖實現的區別資料庫
- 利用wordpress的資料庫操作函式資料庫函式
- 【轉載】關聯式資料庫還是NoSQL資料庫資料庫SQL
- 不用JDBC:ODBC bridge直接操作Access 資料庫 (轉)JDBC資料庫
- 物件導向的關聯式資料庫設計(轉)物件資料庫
- Java響應式關聯式資料庫多執行緒實現方式Java資料庫執行緒
- 在關聯式資料庫中儲存RDF (轉)資料庫
- 關聯式資料庫SQL語言詳解(轉)資料庫SQL
- Web Sql 關聯式資料庫WebSQL資料庫
- 關聯式資料庫設計資料庫
- 利用Dbutils實現往兩個有關聯的表新增資料
- 關聯式資料庫的封建迷信資料庫
- 利用 XForms 和 ODF 實現互動式辦公文件ORM
- 關聯式資料庫與文件資料庫對比資料庫
- 關聯式資料庫很快會替代向量資料庫資料庫
- jdbc-odbc連線資料庫 (轉)JDBC資料庫
- Java實現資料庫和資料表的二級聯動Java資料庫
- 使用反應式關聯式資料庫連線規範R2DBC操作MySQL資料庫資料庫MySql
- 如實實現不同資料庫之間的 (模型) Eloquent: 關聯資料庫模型
- 關聯式資料庫分片原則資料庫
- 關聯式資料庫 Query_Execution資料庫
- 關聯式資料庫和NoSQL結合使用:MySQL + MongoDB資料庫MySqlMongoDB
- 資料庫 - 關聯式資料庫標準語言SQL資料庫SQL
- 從關聯式資料庫遷移到NoSQL雲資料庫資料庫SQL
- 關聯式資料庫索引設計和優化器前言資料庫索引優化
- 從關聯式資料庫遷移到CouchDB資料庫
- 資料庫連線==odbc資料庫
- 【資料庫】MFC ODBC(一)資料庫
- 【資料庫】MFC ODBC(二)資料庫
- 【資料庫】MFC ODBC(三)資料庫
- 【資料庫】MFC ODBC(四)資料庫
- 資料庫實驗4:JDBC&ODBC資料庫JDBC
- NHibernate利用Mindscape.NHibernateModelDesigner實現資料庫與實體之間的轉換及操作資料庫
- 2.3.2 關於使用互動式DBCA建立資料庫資料庫
- Solaris下Domino資料的移植(轉)
- 一個用功能強大的ODBC API 函式訪問資料庫類 (轉)API函式資料庫
- 利用Docker容器實現代理轉發和資料備份Docker