在數(shù)據(jù)庫(kù)應(yīng)用程序中,經(jīng)常需要與外部的數(shù)據(jù)源進(jìn)行數(shù)據(jù)交換。通常我們會(huì)考慮利用開(kāi)放式數(shù)據(jù)庫(kù)互連標(biāo)準(zhǔn)ODBC。ODBC由驅(qū)動(dòng)程序管理器和一系列把SQL作為它們?cè)L問(wèn)語(yǔ)言的驅(qū)動(dòng)程序所組成。當(dāng)需要時(shí),ODBC驅(qū)動(dòng)程序翻譯各種產(chǎn)品的SQL語(yǔ)言以使不同產(chǎn)品間的連接完美無(wú)缺,從而使得連接另外一個(gè)應(yīng)用程序上的數(shù)據(jù)成為可能,甚至可以在Visual FoxPro并不直接支持的格式(例如電子表格)中提取和修改數(shù)據(jù)。鑒于ODBC早已經(jīng)被很多程序員所熟知,我們這里僅僅討論一種不太常用的方法:DDE。
----DDE是一種動(dòng)態(tài)數(shù)據(jù)交換機(jī)制(Dynamic Data Exchange,DDE)。使用DDE通訊需要兩個(gè)Windows應(yīng)用程序,其中一個(gè)作為服務(wù)器處理信息,另外一個(gè)作為客戶(hù)機(jī)從服務(wù)器獲得信息。客戶(hù)機(jī)應(yīng)用程序向當(dāng)前所激活的服務(wù)器應(yīng)用程序發(fā)送一條消息請(qǐng)求信息,服務(wù)器應(yīng)用程序根據(jù)該信息作出應(yīng)答,從而實(shí)現(xiàn)兩個(gè)程序之間的數(shù)據(jù)交換。在Visual FoxPro中,一共十一個(gè)常用的DDE函數(shù),它們是:
DDEAbortTrans() 刪除異步的DDE處理
DDEAdvise() 建立與服務(wù)器應(yīng)用程序的溫或熱連接
DDEEnabled() 設(shè)置或返回DDE狀態(tài)
DDEExecute() 向服務(wù)器應(yīng)用程序發(fā)送一條執(zhí)行消息
DDEInitiate() 打開(kāi)到服務(wù)器應(yīng)用程序的DDE控制板
DDELastError() 返回DDE函數(shù)引起的最后一條錯(cuò)誤信息
DDEPoke() 傳送數(shù)據(jù)庫(kù)到客戶(hù)機(jī)或服務(wù)器應(yīng)用程序
DDERequest() 服務(wù)器應(yīng)用程序請(qǐng)求數(shù)據(jù)
DDESetOption() 修改或返回DDE設(shè)置
DDESetService() 添加、刪除、修改服務(wù)名的狀態(tài)
DDESetTopic() 連接服務(wù)名與標(biāo)題名
DDETerminte() 關(guān)閉DDE控制板
----Visual FoxPro既可以作為DDE客戶(hù)機(jī),也可以作為DDE服務(wù)器。當(dāng)Visual FoxPro作為客戶(hù)機(jī)時(shí),一個(gè)典型的請(qǐng)求從其他應(yīng)用程序輸入數(shù)據(jù)的FoxPro程序由包含以下步驟的代碼組成:
調(diào)用DDEInitiate()函數(shù)建立與服務(wù)器應(yīng)用程序的連接。
如果成功地建立了連接關(guān)系,調(diào)用DDERequest()函數(shù)請(qǐng)求從服務(wù)器應(yīng)用程序輸入信息??梢灾貜?fù)調(diào)用DDERequest()函數(shù)請(qǐng)求輸入其他的信息。
完成對(duì)數(shù)據(jù)的請(qǐng)求后,調(diào)用DDETerminate()函數(shù)技術(shù)與服務(wù)器應(yīng)用程序的連接關(guān)系。只有這樣做才能夠釋放系統(tǒng)資源。
當(dāng)Visual FoxPro作為服務(wù)器時(shí),一個(gè)典型的響應(yīng)其他應(yīng)用程序請(qǐng)求數(shù)據(jù)的FoxPro程序由包含以下步驟的代碼組成:
調(diào)用DDESetService()函數(shù)生成服務(wù)過(guò)程(建立服務(wù)過(guò)程名)并且指定服務(wù)過(guò)程的類(lèi)型。
調(diào)用DDESetTopic()函數(shù)生成服務(wù)標(biāo)題并且指定客戶(hù)機(jī)請(qǐng)求中設(shè)定標(biāo)題時(shí)的運(yùn)行過(guò)程。
生成DDESetTopic()中指定的過(guò)程用以接受傳遞給過(guò)程的參量??蛻?hù)機(jī)請(qǐng)求信息調(diào)用此過(guò)程,此過(guò)程執(zhí)行請(qǐng)求操作并且向客戶(hù)機(jī)應(yīng)用程序返回所請(qǐng)求的信息。
----應(yīng)用程序之間的DDE會(huì)話(huà)可以使用冷連接、溫連接和熱連接。當(dāng)Visual FoxPro做為客戶(hù)機(jī)時(shí),所建立的連接為冷連接;當(dāng)Visual FoxPro做為服務(wù)器時(shí),可以使用其中任意的一種連接方式??梢允褂肈DEAdvise()函數(shù)來(lái)初始化DDE溫連接和熱連接的會(huì)話(huà)。傳遞給DDEAdvise()函數(shù)的參數(shù)之一是一個(gè)用戶(hù)自定義函數(shù)的名稱(chēng),服務(wù)器應(yīng)用程序調(diào)用該函數(shù)通知客戶(hù)機(jī)數(shù)據(jù)已經(jīng)改動(dòng)。因此,在溫連接和熱連接會(huì)話(huà)中,當(dāng)數(shù)據(jù)源有所改動(dòng)時(shí),客戶(hù)機(jī)能夠根據(jù)服務(wù)器的通知自動(dòng)進(jìn)行數(shù)據(jù)更新。
----以下是一個(gè)利用DDE與Word進(jìn)行數(shù)據(jù)交換的示例程序。該程序打開(kāi)一個(gè)DOC文件,將其全部?jī)?nèi)容拷貝到剪貼板上,然后關(guān)閉文件并退出Word。
* 啟動(dòng)應(yīng)用程序Word
RUN /N1 D:\WORD\WINWORD.EXE
* 建立DDE連接
Channel=DDEInitiate(“WinWord”,”System”)
* 判斷連接是否已經(jīng)建立
IF Channel<>-1
* 將Word應(yīng)用程序化
=DDEExecute(Channel,”[AppMaximize]”)
* 打開(kāi)文件d:\word\test.doc
=DDEExecute(Channel,’[FileOpen “d:\word\test.doc”]’)
* 選取所有內(nèi)容
----DDE是一種動(dòng)態(tài)數(shù)據(jù)交換機(jī)制(Dynamic Data Exchange,DDE)。使用DDE通訊需要兩個(gè)Windows應(yīng)用程序,其中一個(gè)作為服務(wù)器處理信息,另外一個(gè)作為客戶(hù)機(jī)從服務(wù)器獲得信息。客戶(hù)機(jī)應(yīng)用程序向當(dāng)前所激活的服務(wù)器應(yīng)用程序發(fā)送一條消息請(qǐng)求信息,服務(wù)器應(yīng)用程序根據(jù)該信息作出應(yīng)答,從而實(shí)現(xiàn)兩個(gè)程序之間的數(shù)據(jù)交換。在Visual FoxPro中,一共十一個(gè)常用的DDE函數(shù),它們是:
DDEAbortTrans() 刪除異步的DDE處理
DDEAdvise() 建立與服務(wù)器應(yīng)用程序的溫或熱連接
DDEEnabled() 設(shè)置或返回DDE狀態(tài)
DDEExecute() 向服務(wù)器應(yīng)用程序發(fā)送一條執(zhí)行消息
DDEInitiate() 打開(kāi)到服務(wù)器應(yīng)用程序的DDE控制板
DDELastError() 返回DDE函數(shù)引起的最后一條錯(cuò)誤信息
DDEPoke() 傳送數(shù)據(jù)庫(kù)到客戶(hù)機(jī)或服務(wù)器應(yīng)用程序
DDERequest() 服務(wù)器應(yīng)用程序請(qǐng)求數(shù)據(jù)
DDESetOption() 修改或返回DDE設(shè)置
DDESetService() 添加、刪除、修改服務(wù)名的狀態(tài)
DDESetTopic() 連接服務(wù)名與標(biāo)題名
DDETerminte() 關(guān)閉DDE控制板
----Visual FoxPro既可以作為DDE客戶(hù)機(jī),也可以作為DDE服務(wù)器。當(dāng)Visual FoxPro作為客戶(hù)機(jī)時(shí),一個(gè)典型的請(qǐng)求從其他應(yīng)用程序輸入數(shù)據(jù)的FoxPro程序由包含以下步驟的代碼組成:
調(diào)用DDEInitiate()函數(shù)建立與服務(wù)器應(yīng)用程序的連接。
如果成功地建立了連接關(guān)系,調(diào)用DDERequest()函數(shù)請(qǐng)求從服務(wù)器應(yīng)用程序輸入信息??梢灾貜?fù)調(diào)用DDERequest()函數(shù)請(qǐng)求輸入其他的信息。
完成對(duì)數(shù)據(jù)的請(qǐng)求后,調(diào)用DDETerminate()函數(shù)技術(shù)與服務(wù)器應(yīng)用程序的連接關(guān)系。只有這樣做才能夠釋放系統(tǒng)資源。
當(dāng)Visual FoxPro作為服務(wù)器時(shí),一個(gè)典型的響應(yīng)其他應(yīng)用程序請(qǐng)求數(shù)據(jù)的FoxPro程序由包含以下步驟的代碼組成:
調(diào)用DDESetService()函數(shù)生成服務(wù)過(guò)程(建立服務(wù)過(guò)程名)并且指定服務(wù)過(guò)程的類(lèi)型。
調(diào)用DDESetTopic()函數(shù)生成服務(wù)標(biāo)題并且指定客戶(hù)機(jī)請(qǐng)求中設(shè)定標(biāo)題時(shí)的運(yùn)行過(guò)程。
生成DDESetTopic()中指定的過(guò)程用以接受傳遞給過(guò)程的參量??蛻?hù)機(jī)請(qǐng)求信息調(diào)用此過(guò)程,此過(guò)程執(zhí)行請(qǐng)求操作并且向客戶(hù)機(jī)應(yīng)用程序返回所請(qǐng)求的信息。
----應(yīng)用程序之間的DDE會(huì)話(huà)可以使用冷連接、溫連接和熱連接。當(dāng)Visual FoxPro做為客戶(hù)機(jī)時(shí),所建立的連接為冷連接;當(dāng)Visual FoxPro做為服務(wù)器時(shí),可以使用其中任意的一種連接方式??梢允褂肈DEAdvise()函數(shù)來(lái)初始化DDE溫連接和熱連接的會(huì)話(huà)。傳遞給DDEAdvise()函數(shù)的參數(shù)之一是一個(gè)用戶(hù)自定義函數(shù)的名稱(chēng),服務(wù)器應(yīng)用程序調(diào)用該函數(shù)通知客戶(hù)機(jī)數(shù)據(jù)已經(jīng)改動(dòng)。因此,在溫連接和熱連接會(huì)話(huà)中,當(dāng)數(shù)據(jù)源有所改動(dòng)時(shí),客戶(hù)機(jī)能夠根據(jù)服務(wù)器的通知自動(dòng)進(jìn)行數(shù)據(jù)更新。
----以下是一個(gè)利用DDE與Word進(jìn)行數(shù)據(jù)交換的示例程序。該程序打開(kāi)一個(gè)DOC文件,將其全部?jī)?nèi)容拷貝到剪貼板上,然后關(guān)閉文件并退出Word。
* 啟動(dòng)應(yīng)用程序Word
RUN /N1 D:\WORD\WINWORD.EXE
* 建立DDE連接
Channel=DDEInitiate(“WinWord”,”System”)
* 判斷連接是否已經(jīng)建立
IF Channel<>-1
* 將Word應(yīng)用程序化
=DDEExecute(Channel,”[AppMaximize]”)
* 打開(kāi)文件d:\word\test.doc
=DDEExecute(Channel,’[FileOpen “d:\word\test.doc”]’)
* 選取所有內(nèi)容