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