SQL pass-through的使用

在VFP所附的範例或者是微軟的建議中,都一直有看到這方面的函數。
事實上,這些函數對於遠端資料的控制來說是很方便的。
如果經過適當包裝的話,就非常類似於Delphi或BCB的TQuery元件或TStoreProc元件,
有看過Delphi或BCB的人可以自行比較一下。
但是偏偏市面上的書對於這個部分如何使用…等都略過不提。
在這裡,提出一個範例供大家研究一下,略盡棉薄之力 。
p.s. Arsen=Ellery, And this article is co-write with Saint.
————————————————————————————————————

*使用SPT更新表格的範例
*作者:Arsen(Ellery)
*環境:在ODBC設定中,我設了fpm這個別名,路徑設到目錄下的foreign.dbc
Local ln_handle
*先連接
ln_handle=sqlconnect("fpm")
*執行查詢
=sqlexec(ln_handle,"select emp_no,name from basic","_basic")
*設定相關屬性:這幾個屬性必須設定,在MSDN上有詳細說明(記得多看MSDN)
=cursorsetprop("tables","basic") &&設定欲更新的資料表格
=cursorsetprop("sendupdates",.t.,"_basic") &&確定要進行更新
=cursorsetprop("keyfieldlist","emp_no","_basic") &&要依據何鍵值來進行更新 =cursorsetprop("updatablefieldlist","emp_no,name","_basic") &&哪些欄位要更新
*以下這行,比較複雜一點,空格前寫的是上一行的欄名,後面寫的是資料表格的欄名(要用alias.field這樣) =cursorsetprop("updatenamelist","emp_no basic.emp_no,name basic.name","_basic")
Replace Next 1 alltrim(name) with alltrim(name)+"Test"
use
*釋放連接
=sqldisconnect(ln_handle)

————————————————————————————————————
首先,謝謝Arsen,幫我解決了想了好久無法解決的問題。
其實,我的作法和他,並無很大的不同,只有這一行
=cursorsetprop(“updatenamelist”,”emp_no basic.emp_no,name basic.name”,”_basic”)
由於資料集預設的BUFFERING是3,所以只要移動記錄指標便會做存檔的動作
為了Client/Server效率上的考量,改用
=CURSORSETPROP(“BUFFERING”,5)
似乎是比較好的選擇。
另外附上另一份範例如下:

?sqldisconnect(0)
?sqlconnect("testdbc")
_sqlsele="sele * from mydbf"
=sqlexec(1,_sqlsele ,"myview")
?cursorsetprop("buffering",5)
REPLACE NAME WITH "TEST"
=cursorsetprop("tables","mydbf","myview")
=cursorsetprop("keyfieldlist","id","MYVIEW")
=cursorsetprop("updatablefieldlist","name","MYVIEW")
=cursorsetprop("sendupdates",.t.,"MYVIEW")
*=cursorsetprop("updatenamelist","ID MYDBF.ID,name MYDBF.name")&&這一行指令,有興趣的人可以比較
=cursorsetprop("updatenamelist","ID MYDBF.ID,name MYDBF.name") &&註解前和註解後有何差別
IF NOT TABLEUPDATE(.T.,.T.,"MYVIEW")
=AERRO(MYERROR)
CLEAR
?MYERROR(1)
?MESSAGE()
ENDIF

另外附上其他的做法,一檥可做到,請自行參考

AA=sqlconnect("testdbc")
IF AA>0
=SQLSETPROP(AA,"ASYNCHRONOUS",.F.)
=SQLSETPROP(AA,"BATCHMODE",.T.)
=SQLEXEC(AA,"sele * from mydbf","myview")
M.SQLDESC="UPDATE ...." &&請參考 SQL INSERT,UPDATE 語法"
=SQLEXEC(AA,M.SQLDESC) &&把指令送到後端讓Server去執行
ENDIF

VFP的認證測驗

VFP的認證測驗,主要測驗的是設計和實作分散式應用程式的解決方案。
在測驗之前,你必須要熟練以下列出的內容:
發展概念和邏輯規劃(Developing the Conceptual and Logical Design)

  • 將資料分組為實體,並且為它們正規化。
  • 在實體之間指定關聯。
  • 選擇能在實體間進行關聯並且擔保指示一致性(Referential Integrity)的外來鍵(Foreign key)。
  • 辨識出關聯到資料一致性(Data Integrity)的商業規則(Business rules)。
  • 將商業規則和限制(Constraint)混合到資料模型中。
  • 給予狀況以決定非正規化是否恰當。

衍伸出實體規劃
審慎評估邏輯規劃中對效率、維護、可伸展性和可利用性潛在的影響。需要考慮的部分包括COM、DCOM和中間層(middle tier)。

  • 發展VFP元件從資料庫中存取資料。
  • 規劃元件的屬性(Properite)和方法(Method)。
  • 規劃類別庫。考慮的部分包含繼承、封裝、容器(containership)、委任(delegation)和多形。

完成發展環境

  • 完成原始程式碼版本控制的環境。
  • 為發展分散式應用程式安裝並設定VFP。
  • 完成發展環境以執行MTS(Microsoft Transaction Server)、IIS(Inter Information Server)和MSMQ(Microsoft Message Queue Server)。

建立使用者服務

  • 實作方向(navigational)規劃
  • 建立選單。
  • 增加一個快捷選單(shortcut menu)到應用程式中。
  • 增加控制項(controls)到表單(forms)中。
  • 為控制項設定屬性。
  • 為控制項指定程式碼以回應一個事件。
  • 建立一個工具列。
  • 建立並管理資料輸入表單和對話盒(dialog boxes)
    • 運用控制項顯示、操作和連結資料。
    • 在執行時期(runtime)新增、刪除和操作控制項。
    • 使用表單集合( Forms collection)以在執行時期操作表單。
    • 給予一個狀況,增加程式碼到適當的表單事件中。這些事件包含Init、Destroy、Load、Unload、QueryUnload、Activate、Deactivate。
  • 檢查使用者輸入。考慮部分包含了單層(single-tier)、二層(two-tier)和多層(n-tier)的應用程式。
  • 在進入表單之後撰寫處理資料的程式碼。
  • 為表單或是Container加入一個ActiveX控制項去操作資料。這些ActiveX控制項包括 TreeView、ListView、ImageList和Web Browser。
  • 從網頁上和VFP互動。考慮到的技術包括FoxISAPI、DHTML、ASP和XML。
  • 產生、喚起和操作一個COM元件。
  • 在分散式應用程式中實作線上使用者輔助說明。
    • 設定恰當的屬性以讓使用者容易瞭解該屬性的用處。求助內容包括求助檔、HelpContextID(求助檔中作為指定訊息或文章的編號)和WhatsThisHelp。
    • 為一個應用程式建立HTML Help。
  • 在桌面應用程式(Desktop Application)為使用者介面(User Interface)實作錯誤處理。
    • 辨識並捕捉執行時期錯誤。
    • 處理行間錯誤(inline errors)。
    • 提示使用者錯誤訊息。
  • 經由Windows API來提昇功能。
  • 建立並管理COM元件

    • 建立一個實作了商業規則或邏輯的COM元件。
    • 建立一個和其他COM元件溝通的COM元件。
    • 為一個COM元件增加錯誤處理。
    • 為了要錯誤處理和除錯,將錯誤記錄下來到一個錯誤檔中。
    • 規劃並建立給MTS使用的元件。
      • 讓一個COM元件支援交易處理。
    • 為一個COM元件建立適合的伺服器類型(Server type)。類型有in-process、out-of-process和multithreaded。
    • 使用MTS Explorer來建立和管理套件。
      • 將原件增加到一個MTS套件中。
    • 利用使用者權限指定使用者只能限制使用某個MTS套件。
    • 使用元件陳列庫去管理元件。
    • 註冊和解除註冊一個COM元件。

    建立資料服務

    • 使用ADO和RDS存取和操作資料。
    • 使用VFP的原生資料處理和查詢能力(Query capabilities)(包含Local View)來存取和操作資料。
    • 使用SQL pass-through存取和操作資料。
    • 使用遠端資料集(Remote views)和本地資料集(Local views)來存取和操作資料。
    • 管理資料庫交易以確保資料一致性和可復原性。
    • 撰寫能取得和變更資料的SQL敘述。
    • 撰寫使用連結(join)來從多個資料表格連結資料的SQL敘述。
    • 撰寫能建立資料集(views)的SQL敘述。
    • 使用適合的鎖定和緩衝策略。策略包括悲觀(pessimistic)、樂觀(optimistic)、列和表格。
    • 建立和操作一個VFP stored procedure。
    • 建立並實作VFP trigger。
    • 從其他外在的資料來源匯入資料。
    • 撰寫能更新及變更資料的SQL敘述。

    建立實體資料庫

    • 以程式來建立和維護VFP的資料庫。
    • 規劃、建立和實作資料庫和資料表格。包含了資料一致性(Data Integrity)、參考完整性(Referential Integrity)和正規化(Normalization)。
    • 選擇並規劃一個索引策略。考慮最佳化(經由Rushmore)和索引維護。
    • 建立並維護索引。考慮最佳化(經由Rushmore)、程式化的操作、視覺化的操作和索引維護。

    測試並除錯

    • 決定適合的除錯技巧。
    • 辨識和描述測試計劃的要素。要素包括beta的測試、回歸測試(Regression testing)、單元測試(unit testing)、整合測試(integration testing)和重點測試(stress testing)。
    • 給予一個狀況,選擇適當的建立選項。(此處應是指在專案管理員裡按下建立後的一些選項)
    • 在應用程式中使用條件編譯。(此處應是指#ifdef、#ifndef…等指令的應用)
    • 使用除錯視窗(Debug Window)監控運算式和變數的值。
      • 使用即時運算視窗(Immediate window)來檢查或變更值。
      • 使用監看視窗(Watch window)來檢查或變更值。
      • 使用呼叫堆疊視窗(Call stack Window)來尋找錯誤。
    • 在應用程式中使用 Asserts。
    • 使用涵蓋分析工具應用程式來辨識效率瓶頸(Performance bottlenecks)和程式碼涵蓋範圍(Code coverage)。
    • 使用事件追蹤來確定事件發生的順序。
    • 設定中斷點以除錯應用程式。

    散發應用程式

    • 使用安裝程式精靈去建立一個能安裝分散式應用程式、註冊COM元件並容許反安裝的安裝程式。
    • 註冊一個實作DCOM的元件。
    • 為客戶端電腦(Client computer)和伺服器端電腦(Server computer)設定DCOM。
    • 為客戶端電腦設定以使用一個MTS元件,並且為客戶端電腦及伺服器端電腦設定遠端自動化(Remote automation)。
    • 為一個分散式應用程式計劃並實作以軟式磁碟機或CD為基礎的散發程式。
    • 為一個分散式應用程式計劃並實作以Web為基礎的散發程式。
    • 為一個分散式應用程式計劃並實作以網路(Network)為基礎的散發程式。

    為應用程式提供維護和支援

    • 為災難復原程序提出計劃並實作之。
    • 修正錯誤並提早評估以預防未來的錯誤。
    • 維護異常的報告。
    • 為分散式應用程式散發應用程式更新。

    VFP7 – Miscellaneous XBase Features

    本文譯自VFP7輔助說明中的Miscellaneous XBase Features
    各種XBase的特色
    VFP包含了一些新的且改進過的XBase特色,這些已經被包含在VFP語言之中.
    這些包含了新工具,像是 Task List Manager(工作清單管理者), Object Browser(物件瀏覽器), IntelliSense Manager(自動完成管理), Accessibility Browser,Automated Test Harness(自動測試工具)和Web Services wizard(WebServices精靈).
    這些東西在其他的What’s New標題中有詳細的說明.
    除了上面所提到的特色之外,VFP包含了其他豐富的XBase加強.
    .新的Foundation Classes 已經加入了Microsoft Agent(代理人), Regular Expressions,Cryptography(密碼學),Enhanced File Open dialog boxes(加強的檔案開啟對話盒), Windows 2000 Logo Information, 和 Web Services 的相關類別.
    .SQL Server的上移精靈包含了一些新的加強.
    .新的 Solution 範例已經加入了怎麼使用新的特色以及foundation classes範例.
    .一個新的COM+服務範例集合教導你怎麼使用帶有COM+服務的VFP伺服器.(COM+服務包含交易,佇列元件,COM+事件和補償資源管理者(Compensating Resource Manager,譯註1)).許多的範例教導你使用新的VFP伺服器加強功能.
    .GENMENU已經更新,以支援新的選單圖形支援.一個新的編譯指示(#IMAGEPATHS)已經被加入以便全路徑(譯註2)被產生時能控制選單圖形.
    譯註1:Compensating Resource Manager不是很清楚是什麼,所以翻的不好.另外這一句是倒裝句,所以我將對COM+服務的說明分離出來了,這樣應該比較容易瞭解.
    譯註2:全路徑的意思應該是說像這樣子的情形 C:\TEST\TEST\TEST\TEST.JPG 發生時.