国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

VFP與SQL遠(yuǎn)程異構(gòu)數(shù)據(jù)庫

2024-07-21 02:10:32
字體:
供稿:網(wǎng)友

<p>&nbsp;</p>熟悉 vfp的朋友都知道,在 vfp 里我們可以使用遠(yuǎn)程視圖 (remote view) 和 spt(sql pass through) 技術(shù)控制遠(yuǎn)程異構(gòu)數(shù)據(jù)庫。這些技術(shù)其實(shí)是 vfp 對(duì) odbc 的 api 的封裝,所以對(duì)于用戶來說訪問遠(yuǎn)程數(shù)據(jù)庫就像操作傳統(tǒng)的dbf一樣簡單。關(guān)于這兩種技術(shù)的使用,完全可以洋洋灑灑地寫下一本書,鑒于本文主題及篇幅,這里僅枚舉 spt 技術(shù)訪問遠(yuǎn)程數(shù)據(jù)的應(yīng)用。

  很多人認(rèn)為有了遠(yuǎn)程視圖這樣直觀、簡單的工具,為什么還需要 spt 呢?確實(shí) spt 較遠(yuǎn)程視圖難以掌握,但細(xì)細(xì)體會(huì)你會(huì)發(fā)現(xiàn):遠(yuǎn)程視圖其實(shí)是對(duì) spt 的可視化工具!spt 較遠(yuǎn)程視圖更具威力,遠(yuǎn)程視圖提供的功能只是 spt 的一個(gè)子集。其優(yōu)勢和劣勢主要體現(xiàn)在以下幾個(gè)方面:

  l、spt 的優(yōu)勢

  1) 一次得到多個(gè)cursor;

  2) 執(zhí)行除 select 以外的其他 sql 語句,如 insert、update、delete等;

  3) 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫的存儲(chǔ)過程 ;

  4) 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫的特殊函數(shù)、命令等 ;

  5) 事務(wù)管理 。

  2、spt 的劣勢

  1) 沒有圖形用戶界面;

  2) 必須人工維護(hù)連接;

  3) 得到的cursor默認(rèn)是“可讀寫”cursor,要使它成為“可更新”cursor必須經(jīng)過設(shè)置才行。

  下面就順著我們對(duì) spt 的認(rèn)識(shí),來瀏覽一下這個(gè)偉大的工具吧!(注意:本文所有例程均使用 sql server的northwind 數(shù)據(jù)庫演示)。

  管理連接

  l、建立連接

  注意:本文所有示例的代碼若用到連接的,默認(rèn)采用“建立連接”代碼中產(chǎn)生的連接句柄 “con”。

  wait /' 連接到 sql server 上去 /' nowait noclear window

  sqlsetprop(0,"displogin" ,3) &&&& 設(shè)置環(huán)境為“從不顯示 odbc 登錄對(duì)話框”。

  con=sqlstringconnect("driver=sql server;server=boe;uid=sa;pwd=;database=northwind")

  *假定 sql server 服務(wù)器名為 boe, 用戶 id 是sa, 口令是空串

  *如果你的 sql server 的服務(wù)器名, 用戶 id, 口令與上不同,請(qǐng)修改以上代碼中的相關(guān)部分以符合你系統(tǒng)中的設(shè)置

  wait clear

  if con<=0

  messagebox(/' 連接失敗 /',64,/' 連接到 sql server 上去 /')

  else

  messagebox(/' 連接成功 /',64,/' 連接到 sql server 上去 /')

  endif

  2、斷開連接

  sqldisconnect(con)

  一次得到多個(gè)cursor

  我們可以用一次 spt 傳回多個(gè)cursor,如下:

  csql="select * from employees"+chr(10)+"select * from customers"+chr(10)+"select * from products"

  ?sqlexec(con,csql,"temp")

  sqlexec( ) 的返回值表示cursor的數(shù)量,這里返回 3 。這三個(gè)cursor分別以 temp、temp1和temp2 命名。

  執(zhí)行其他 sql 語句

  下面我們嘗試執(zhí)行sql server以外的sql語句:

  csql="if exists(select * from customersswheres customerid=/'test/')"

  csql=csql+" delete from customersswheres customerid=/'test/'" csql=csql+" else insert customers(customerid,companyname) values(/'test/',/' 這是一個(gè)測試! /')"

  if sqlexec(con,csql)<=0

  messagebox(/' 執(zhí)行失敗 /',64,/' 發(fā)送語句到 sql server 上去 /')

  else

  messagebox(/' 執(zhí)行成功 /',64,/' 發(fā)送語句到 sql server 上去 /')

  endif

  行文至此,也許有朋友會(huì)問:如果 sql 語句中 customerid 是一個(gè)變量怎么辦呢?其實(shí) 我們可以通過兩個(gè)常用的解決方案來解決:

  1、拼接字符串

  custid=/'test/'

  csql="if exists(select * from customersswheres customerid=/'"+custid+"/')"

  csql=csql+" delete from customers swherescustomerid=/'"+custid+"/'"

  csql=csql+" else insert customers(customerid,companyname) values(/'"+custid+"/',/' 這是一個(gè)測試! /')"

  ?sqlexec(con,csql)

  2、spt 標(biāo)準(zhǔn)變量傳遞法

  custid=/'test/'

  csql="if exists(select * from customersswherescustomerid=?custid)"

  csql=csql+" delete from customersswherescustomerid=?custid"

  csql=csql+" else insert customers(customerid,companyname) values(?custid,/' 這是一個(gè)測試! /')"

  ?sqlexec(con,csql)

  特殊函數(shù)和命令

  如果在 sql server 中你有足夠的權(quán)限,通過 spt 使用遠(yuǎn)程數(shù)據(jù)庫的特殊函數(shù)和命令,你可以完全控制 sql server ,這里我們就演示“怎樣取得數(shù)據(jù)庫服務(wù)器的時(shí)間”:

  ?sqlexec(con,"select getdate() as serverdatetime","temp1")

  ?temp1.serverdatetime

  use in ("temp1")

  事務(wù)管理

  在一些復(fù)雜的應(yīng)用中,往往會(huì)有一項(xiàng)操作影響幾個(gè)表的情況。就客戶端來說,發(fā)送到遠(yuǎn)程數(shù)據(jù)庫的數(shù)據(jù)變動(dòng)可能來源很多:表緩沖的多行記錄的變動(dòng),行緩沖的單行記錄變化,以及前文我們演示的直接用 sql 語句傳遞的數(shù)據(jù)維護(hù),林林總總……怎樣把這些更新行為控制在一個(gè)事務(wù)中呢!要么一起成功,要么一起回滾。

  csql="delete from customersswherescustomerid=/'blaus/'"+chr(10)

  csql=csql+"insert customers(customerid,companyname) values(/'test1/',/' 這是一個(gè)測試! /')"

  sqlsetprop(con,"transactions" ,2)&&&& 開始一個(gè)事務(wù)

  ireturn=sqlexec(con,csql)

  if ireturn=1

  sqlcommit(con)&&&& 事務(wù)交付

  else

  sqlrollback(con)&&&& 事務(wù)回滾

  endif

  sqlsetprop(con,"transactions" ,1)&&&& 重新回到自動(dòng)事務(wù)處理狀態(tài)

  &&&&就本例而言,“delete from customersswheres customerid=/'blaus/'”總是不能執(zhí)行的,sql server會(huì)返回出錯(cuò)揭示:

  &&&&delete statement conflicted with column reference constraint /'fk_orders_customers/'.

  &&&&the conflict occurred in database /'northwind/', table /'orders/', column /'customerid/'.

  &&&&所以這筆事務(wù)總是被回滾的!!

  從例程中可以看到,我們開啟的事務(wù)其實(shí)是針對(duì)“連接”的,也就是說通過該“連接”的所有數(shù)據(jù)更新都包含于事務(wù)中,直到事務(wù)被回滾或交付。

  sqlsetprop(con,"transactions" ,2 ), 其實(shí)是開啟了人工事務(wù)處理,也就是說必須由用戶明確地給出交付或者回滾指令,事務(wù)才會(huì)結(jié)束。所以筆者以為:完成一筆事務(wù)以后,應(yīng)執(zhí)行 sqlsetprop(con,"transactions" ,1 ) 將“連接”的事務(wù)模式設(shè)為默認(rèn)的“自動(dòng)”,這樣可以防止用戶陷入未知的事務(wù)中去。

  spt的基本操作還不止這些,以后我們還會(huì)為讀者朋友介紹其他一些基本操作。如果朋友們能掌握這些基本操作,就能編寫不錯(cuò)的 c/s 程序了。雖然本文是用 sql server 作為遠(yuǎn)程數(shù)據(jù)庫,但是如果你使用 db2和oracle等,在 vfp 中也可以進(jìn)行同樣的處理。

  本文開始已提到 vfp 在這方面的內(nèi)容很廣泛,寥寥千言當(dāng)然不能盡言,有興趣的朋友可以去訪問www.boeworks.com,以便查閱更多的內(nèi)容。ok,希望有機(jī)會(huì)與大家一起討論這方面的問題。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 卢湾区| 拜城县| 治县。| 宁武县| 讷河市| 岫岩| 阳东县| 琼海市| 平阴县| 衡阳县| 滨州市| 海盐县| 涞水县| 庄浪县| 淅川县| 蒙城县| 新和县| 海门市| 渭南市| 新余市| 高安市| 班玛县| 喀什市| 马尔康县| 绥芬河市| 许昌市| 登封市| 怀仁县| 大方县| 巢湖市| 化州市| 荣成市| 固镇县| 宜阳县| 双峰县| 洪泽县| 克拉玛依市| 永仁县| 仁寿县| 英超| 信阳市|