關於VFP和SQL Server的

2022-06-09 08:03:11 字數 4634 閱讀 4701

1樓:匿名使用者

 1. exists謂詞

 存在量詞$

 帶有exists謂詞的子查詢不返回任何資料,只產生邏輯真值「true」或邏輯假值「false」。

 若內層查詢結果非空,則外層的where子句返回真值 若內層查詢結果為空,則外層的where子句返回假值 由exists引出的子查詢,其目標列表示式通常都用* ,因為帶exists的子查詢只返回真值或假值,給出列名無實際意義

 2. not exists謂詞

 若內層查詢結果非空,則外層的where子句返回假值 若內層查詢結果為空,則外層的where子句返回真值in比較簡單我就不說了……

2樓:

熟悉 vfp的朋友都知道,在 vfp 裡我們可以使用遠端檢視 (remote view) 和 spt(sql pass through) 技術控制遠端異構資料庫。這些技術其實是 vfp 對 odbc 的 api 的封裝,所以對於使用者來說訪問遠端資料庫就像操作傳統的dbf一樣簡單。關於這兩種技術的使用,完全可以洋洋灑灑地寫下一本書,鑑於本文主題及篇幅,這裡僅列舉 spt 技術訪問遠端資料的應用。

很多人認為有了遠端檢視這樣直觀、簡單的工具,為什麼還需要 spt 呢?確實 spt 較遠端檢視難以掌握,但細細體會你會發現:遠端檢視其實是對 spt 的視覺化工具!

spt 較遠端檢視更具威力,遠端檢視提供的功能只是 spt 的一個子集。其優勢和劣勢主要體現在以下幾個方面:

l、spt 的優勢

1) 一次得到多個cursor;

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

3) 執行遠端資料庫的儲存過程 ;

4) 執行遠端資料庫的特殊函式、命令等 ;

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) &&&& 設定環境為「從不顯示 odbc 登入對話方塊」。

con=sqlstringconnect("driver=sqlserver;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 命名。

執行其他 sql 語句

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

csql="if exists(select * from customers where customerid='test')"

csql=csql+" delete from customers where customerid='test'"

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

if sqlexec(con,csql)<=0

messagebox(' 執行失敗 ',64,' 傳送語句到 sql server 上去 ')

else

messagebox(' 執行成功 ',64,' 傳送語句到 sql server 上去 ')

endif

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

1、拼接字串

custid='test'

csql="if exists(select * from customers where customerid='"+custid+"')"

csql=csql+" delete from customers where customerid='"+custid+"'"

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

?sqlexec(con,csql)

2、spt 標準變數傳遞法

custid='test'

csql="if exists(select * from customers where customerid=?custid)"

csql=csql+" delete from customers where customerid=?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")

事務管理

在一些複雜的應用中,往往會有一項操作影響幾個表的情況。就客戶端來說,傳送到遠端資料庫的資料變動可能**很多:表緩衝的多行記錄的變動,行緩衝的單行記錄變化,以及前文我們演示的直接用 sql 語句傳遞的資料維護,林林總總……怎樣把這些更新行為控制在一個事務中呢!

要麼一起成功,要麼一起回滾。

csql="delete from customers where customerid='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)&&&& 重新回到自動事務處理狀態

&&&&就本例而言,「delete from customers where customerid='blaus'」總是不能執行的,sql server會返回出錯揭示:

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

從例程中可以看到,我們開啟的事務其實是針對「連線」的,也就是說通過該「連線」的所有資料更新都包含於事務中,直到事務被回滾或交付。

sqlsetprop(con,"transactions" ,2 ), 其實是開啟了人工事務處理,也就是說必須由使用者明確地給出交付或者回滾指令,事務才會結束。所以筆者以為:完成一筆事務以後,應執行 sqlsetprop(con,"transactions" ,1 ) 將「連線」的事務模式設為預設的「自動」,這樣可以防止使用者陷入未知的事務中去。

spt的基本操作還不止這些,以後我們還會為讀者朋友介紹其他一些基本操作。如果朋友們能掌握這些基本操作,就能編寫不錯的 c/s 程式了。雖然本文是用 sql server 作為遠端資料庫,但是如果你使用 db2和oracle等,在 vfp 中也可以進行同樣的處理。

關於vfp裡面的for迴圈語句,vfp 中的for語句怎麼用

嚴格來說是不允許對for迴圈控制變數進行人為修改的,會造成除錯困難,甚至造成死迴圈。主要是看編譯器或直譯器是否認為這樣做存在語法錯誤。free pascal就不允許這樣,編譯通不過,turbo系統好象都可以,tp tc都可以編譯執行 如果的確有需要對迴圈控制變數進行修改,建議使用while迴圈 迴圈...

關於sqlserver許可模式,關於SQL Server許可模式

在sql server企業版中,有一個許可模式概念,有兩種許可模式 處理器許可證 和 每客戶 模式。處理器許可證 模式表示允許幾個cpu執行sql server,每客戶 決定的是客戶端連線數。許可模式一旦選擇則無法更改,也就是說無法從一種模式切換到另一種模式,但可以更改 許可證數 和 處理器數 要檢...

關於SQL Server裡邊的日期計算

在你的表中,新增一列c,並在列屬性中的 計算所得的列規範 公式中寫上 datediff day,a,b 就可以了。或者執行如下語句 alter table table add c as datediff day,a,b 先增加c列,然後 update table name set c datedif...