• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發(fā)教程 > 詳細頁面

        VFP與SQL遠程異構數據庫

        VFP與SQL遠程異構數據庫

        更新時間:2022-05-03 文章作者:未知 信息來源:網絡 閱讀次數:

        文/陳純

          熟悉 VFP的朋友都知道,在 VFP 里我們可以使用遠程視圖 (Remote View) 和 SPT(SQL Pass Through) 技術控制遠程異構數據庫。這些技術其實是 VFP 對 ODBC 的 API 的封裝,所以對于用戶來說訪問遠程數據庫就像操作傳統的DBF一樣簡單。關于這兩種技術的使用,完全可以洋洋灑灑地寫下一本書,鑒于本文主題及篇幅,這里僅枚舉 SPT 技術訪問遠程數據的應用。

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

          l、SPT 的優(yōu)勢

          1) 一次得到多個Cursor;

          2) 執(zhí)行除 Select 以外的其他 SQL 語句,如 Insert、Update、Delete等;

          3) 執(zhí)行遠程數據庫的存儲過程 ;

          4) 執(zhí)行遠程數據庫的特殊函數、命令等 ;

          5) 事務管理 。

          2、SPT 的劣勢

          1) 沒有圖形用戶界面;

          2) 必須人工維護連接;

          3) 得到的Cursor默認是“可讀寫”Cursor,要使它成為“可更新”Cursor必須經過設置才行。

          下面就順著我們對 SPT 的認識,來瀏覽一下這個偉大的工具吧!(注意:本文所有例程均使用 SQL Server的NorthWind 數據庫演示)。


          管理連接


          l、建立連接

          注意:本文所有示例的代碼若用到連接的,默認采用“建立連接”代碼中產生的連接句柄 “CON”。

          WAIT ' 連接到 SQL Server 上去 ' NOWAIT NOCLEAR WINDOW

          SQLSETPROP(0,"DispLogin" ,3) &&&& 設置環(huán)境為“從不顯示 ODBC 登錄對話框”。

          CON=SQLSTRINGCONNECT("driver=SQL Server;Server=BOE;Uid=sa;pwd=;database=northwind")

          *假定 SQL Server 服務器名為 BOE, 用戶 ID 是sa, 口令是空串

          *如果你的 SQL Server 的服務器名, 用戶 ID, 口令與上不同,請修改以上代碼中的相關部分以符合你系統中的設置

          WAIT clear

          IF con<=0

          MESSAGEBOX(' 連接失敗 ',64,' 連接到 SQL Server 上去 ')

          ELSE

          MESSAGEBOX(' 連接成功 ',64,' 連接到 SQL Server 上去 ')

          ENDIF

          2、斷開連接

          SQLDISCONNECT(CON)


          一次得到多個Cursor


          我們可以用一次 SPT 傳回多個Cursor,如下:

          cSQL="SELECT * FROM EMPLOYEES"+CHR(10)+"SELECT * FROM CUSTOMERS"+CHR(10)+"SELECT * FROM PRODUCTS"

          ?SQLEXEC(con,cSQL,"TEMP")

          SQLEXEC( ) 的返回值表示Cursor的數量,這里返回 3 。這三個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',' 這是一個測試! ')"

          IF SQLEXEC(CON,cSQL)<=0

          MESSAGEBOX(' 執(zhí)行失敗 ',64,' 發(fā)送語句到 SQL Server 上去 ')

          ELSE

          MESSAGEBOX(' 執(zhí)行成功 ',64,' 發(fā)送語句到 SQL Server 上去 ')

          ENDIF

          行文至此,也許有朋友會問:如果 SQL 語句中 CUSTOMERID 是一個變量怎么辦呢?其實 我們可以通過兩個常用的解決方案來解決:

          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+"',' 這是一個測試! ')"

          ?SQLEXEC(CON,cSQL)

          2、SPT 標準變量傳遞法

          CUSTID='TEST'

          cSQL="IF EXISTS(SELECT * FROM CUSTOMERSswheresCUSTOMERID=?CUSTID)"

          cSQL=cSQL+" DELETE FROM CUSTOMERSswheresCUSTOMERID=?CUSTID"

          cSQL=cSQL+" ELSE INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES(?CUSTID,' 這是一個測試! ')"

          ?SQLEXEC(CON,cSQL)


          特殊函數和命令


          如果在 SQL Server 中你有足夠的權限,通過 SPT 使用遠程數據庫的特殊函數和命令,你可以完全控制 SQL Server ,這里我們就演示“怎樣取得數據庫服務器的時間”:

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

          ?temp1.serverdatetime

          USE IN ("temp1")


          事務管理


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

          cSQL="DELETE FROM CUSTOMERSswheresCUSTOMERID='BLAUS'"+CHR(10)

          cSQL=cSQL+"INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES('TEST1',' 這是一個測試! ')"

          SQLSETPROP(CON,"Transactions" ,2)&&&& 開始一個事務

          IRETURN=SQLEXEC(CON,cSQL)

          IF IRETURN=1

          SQLCOMMIT(CON)&&&& 事務交付

          ELSE

          SQLROLLBACK(CON)&&&& 事務回滾

          ENDIF

          SQLSETPROP(CON,"Transactions" ,1)&&&& 重新回到自動事務處理狀態(tài)

          &&&&就本例而言,“DELETE FROM CUSTOMERSswheres CUSTOMERID='BLAUS'”總是不能執(zhí)行的,SQL Server會返回出錯揭示:

          &&&&DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_Orders_Customers'.

          &&&&The conflict occurred in database 'Northwind', table 'Orders', column 'CustomerID'.

          &&&&所以這筆事務總是被回滾的!!

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

          SQLSETPROP(CON,"Transactions" ,2 ), 其實是開啟了人工事務處理,也就是說必須由用戶明確地給出交付或者回滾指令,事務才會結束。所以筆者以為:完成一筆事務以后,應執(zhí)行 SQLSETPROP(CON,"Transactions" ,1 ) 將“連接”的事務模式設為默認的“自動”,這樣可以防止用戶陷入未知的事務中去。

          SPT的基本操作還不止這些,以后我們還會為讀者朋友介紹其他一些基本操作。如果朋友們能掌握這些基本操作,就能編寫不錯的 C/S 程序了。雖然本文是用 SQL Server 作為遠程數據庫,但是如果你使用 DB2和Oracle等,在 VFP 中也可以進行同樣的處理。

          本文開始已提到 VFP 在這方面的內容很廣泛,寥寥千言當然不能盡言,有興趣的朋友可以去訪問www.boeworks.com,以便查閱更多的內容。OK,希望有機會與大家一起討論這方面的問題。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 羞羞视频免费网站在线看| 免费大片黄在线观看| 一级毛片免费观看| 亚洲AV永久无码精品网站在线观看| 国产激情免费视频在线观看| 成年大片免费视频| 亚洲国产成人精品青青草原| 最近免费中文字幕mv在线电影| 亚洲精品成人久久| 日韩视频在线精品视频免费观看| 亚洲区不卡顿区在线观看| 窝窝影视午夜看片免费| 久久国产成人精品国产成人亚洲| 丁香花在线观看免费观看图片 | 亚洲精品天堂在线观看| 国内自产拍自a免费毛片| 亚洲国产精品无码中文lv| 日韩亚洲精品福利| 中文字幕a∨在线乱码免费看| 亚洲AV日韩AV永久无码绿巨人| 57pao一国产成视频永久免费| 亚洲无码一区二区三区| 免费日韩在线视频| 中国人免费观看高清在线观看二区| 久久久久久久久亚洲| 希望影院高清免费观看视频| 色窝窝亚洲av网| 午夜国产精品免费观看| 亚洲综合色一区二区三区| 亚洲国产黄在线观看| 亚洲熟女综合一区二区三区 | 国产人成免费视频| 成人免费区一区二区三区| 亚洲六月丁香六月婷婷蜜芽| 国产成人精品免费视频软件| 成人网站免费看黄A站视频| 最新国产精品亚洲| 久久亚洲国产午夜精品理论片 | 亚洲啪啪免费视频| 看免费毛片天天看| 久久精品国产亚洲AV无码麻豆|