vfp

vfp

Visual FoxPro ,是Microsoft公司從Fox公司的FoxBase資料庫軟體經過數次改良,並且移植到Windows之後,得來的應用程式開發軟體,主要用於開發數據管理與運算等方面的軟體。VFP是Microsoft公司推出的最新可視化資料庫管理系統平台,是功能特彆強大的32位資料庫管理系統。它提供了功能完備的工具、極其友好的用戶界面、簡單的數據存取方式、獨一無二的跨平台技術,具有良好的兼容性、真正的可編譯性和較強的安全性,是目前最快捷、最實用的資料庫管理系統軟體之一。

基本介紹

  • 軟體名稱:Visual FoxPro 
  • 開發商:Microsoft公司
  • 軟體平台:PC
  • 軟體語言:英文
特性,成長之路,VFP 6,VFP 7,VFP 8,VFP 9,後續,需要注意,

特性

FoxBase採用命令行方式(為了和當時流行的資料庫軟體dBase兼容……)但是速度比當時其他的資料庫軟體要快。
由於其為32位的資料庫開發系統且具有良好的跨平台特性,它可以運行於Windows95/98/2000/XP/Vista/7等作業系統之上。

成長之路

Visual FoxPro(以下簡稱VFP)是個不斷成長的小伙,承蒙Visual Studio(以下簡稱VS)的關照,VFP在開發者心目中一直是和VB、VC地位相同的工具語言,只不過它並不是通用開發工具,而只是專注於資料庫套用的開發。
然而,吊足大家胃口的VS. NET終於出現在開發者面前時,竟不見了VFP的身影,著實引起開發社區的一陣騷動。微軟不要VFP了?不是,恰恰相反,VFP忍受不了VS緩慢的升級速度,“單幹”了。現在的VFP已經升級到版本9,並且完全支持.NET技術。

VFP 6

Visual FoxPro 6.0及其中文版,是可運行於Windows 95和Windows NT平台的32位資料庫開發系統,它不僅可以簡化資料庫管理,而且能使應用程式的開發流程更為合理。Visual FoxPro 6.0使組織數據、定義資料庫規則和建立應用程式等工作變得簡單易行。利用可視化的設計工具和嚮導,用戶可以快速創建表單、查詢和列印報表。
Visual FoxPro 6.0還提供了一個集成化的系統開發環境,它不僅支持過程式編程技術,而且在語言方面作了強大的擴充,支持面向對象可視化編程技術,並擁有功能強大的可視化程式設計工具。目前,Visual FoxPro 6.0是用戶收集信息、查詢數據、創建集成資料庫系統、進行實用系統開發較為理想的工具軟體。

VFP 7

Web Services支持 VFP 7支持註冊和發布Web Services,而無需使用Microsoft SOAP Toolkit和VFP擴展來從底層完成這些任務;
伺服器增強 VFP 7對於COM伺服器作了很大程度的增強,可以與核心平台如COM+服務進行互操作;
XML支持 為了適應以XML形式在Web上傳送數據的潮流,VFP 7提供了一些函式用於在XML數據和FoxPro游標(Cursor)或表格(Table)之間的轉換。
多樣的XBase特性 VFP添加了很多新的或改進的XBase特性,並且這些特性都是用VFP語言編寫的;
OLE DB Provider 通過實現OLE DB Provider接口,開發者可以在任何支持OLE DB的程式和語言中調用VFP數據。

VFP 8

n 數據特性增強 VFP 8對其數據特性進行了改進,並增加了很多新的數據特性,包括:遠程數據連線、創建DataEnvironment類、自動增長域值、支持對照序列、與SQL語句Select…Union之間的隱式數據轉換、使用SQL Select命令插入行等;
其他增強 VFP 8對一些工具、示例資料庫和解決方案案例都進行了改進。

VFP 9

數據和XML增強 這一時期的VFP對其數據特性進行了巨大的加強,改進項目之多真是令人眼花繚亂,詳情可以參考這裡,此處不再贅述;
實現SQL語言 VFP 9已經能夠充分地支持SQL查詢語言;
設計器的增強 VFP 9增強了這些設計器:報表和標籤設計器、選單設計器、表格設計器、查詢和視圖設計器、數據環境設計器以及類和窗體設計器等;
其他方面的增強 和VFP 8一樣,VFP 9在其他微小的細節上進行了不少的改進,使得開發者的體驗更加舒適。

後續

微軟已經於,2007年前後,宣布 Visual Foxpro 停止研發,VFP9 是最後一個官方版本。微軟在曾經2007年3月份的時候聲稱,將會對 Visual Foxpro 開放原始碼到其代碼共享社區站點CodePlex上,但是截止到2010年4月,在CodePlex似乎似然搜尋不到Visual Foxpro的原始碼。
日前,在微軟官方網站釋出了一份公告A Message to the Community,說明未來將不會再推出 VFP 10,並且持續 VFP 9 的支持到 2015 年,之後只會在 2007 年夏季推出 SP2。2006年進行的 Sedna 項目則是增強VFP對SQL Server 2005與 Vista的支持,其他的一些項目則已經開源到CodePlex

需要注意

SPT的全稱為SQL Pass-Through,它和遠程視圖(Remote View)、CA(CursorAdapter,VFP8及後序版本支持)共同構成了VFP實現資料庫操作的利器。遠程視圖及CA實質上都是基於SPT技術,與它們相比,SPT要更為靈活,它可以直接創建資料庫接連,執行資料庫原生SQL語句,並可以獲取臨時表(Cursor),通過設定能使對臨時表的更改更新到資料庫表中。SPT的缺點是不面向對象、代碼量大。
與資料庫建立
VFP可以通過SQLCONNECT()函式或SQLSTRINGCONNECT()函式可以和任何支ODBC驅動的資料庫建立連線,成功建立連線後將返回一個大於0的整數型句柄,如果連線失敗則會返回-1。通過這個句柄我們可以用SQLEXEC()函式向資料庫傳送SQL語句,最後需要調用SQLDISCONNECT( )函式斷掉連線。
例1:假設已存在一個名稱為MyNewDB的數據源,用戶名是sa,密碼是admin,使用SQLCONNECT()函式創建資料庫連線。
LOCAL lnHandle
lnHandle = SQLCONNECT("MyNewDB", "sa", "admin")
? "已成功創建資料庫連線,連線句柄是:", lnHandle
= SQLDISCONNECT(lnHandle)
例2:連線位於192.168.0.100的某台SQL Server資料庫伺服器上的MyNewDB資料庫,,用戶名是sa,密碼是admin,使用SQLSTRINGCONNECT()函式創建資料庫連線。
LOCAL lcConnStr, lnHandle
lcConnStr = "Driver=SQL Server;Server=192.168.0.100;" + ;
:Database=MyNewDB;UID=sa;PWD=admin"
lnHandle = SQLSTRINGCONNECT(lcConnStr)
IF lnHandle > 0
= MESSAGEBOX("資料庫連線成功。", 64, "提示信息")
= SQLDISCONNECT(lnHandle)
ELSE
= MESSAGEBOX("資料庫連線失敗。", 48, "提示信息")
ENDIF
如何向伺服器取數據
在第一步建立和伺服器資料庫的連線,並取得連線句柄nhandle後
sqlexec(jb,"select * from tablename","cursorname")
如何向伺服器取數據
如向伺服器表employees查詢性別為男的人員
在第一步建立和伺服器資料庫的連線,並取得連線句柄nhandle後
sqlexec(nhandle,"select * from employees where sex=’男’","employees")
select employees
brow
也可以調用系統上的存儲過程來取得數據.
如在伺服器建立存儲過程
create proc getmanofworkes
as
select * from employees where sex=’男’
go
然後在vfp里調用
sqlexec(nhandle,"exec getmanofworkes",employees)
select employees
brow
當然也可以想存儲過程傳遞參數查詢
仍然以剛才的例子,查詢不同性別的員工
伺服器上建立create proc getemployees
@sex char(2)=’男’
as
select * from employees where sex=@sex
go
vfp里調用
查詢男員工
csex=’男’
sqlexec(nhandle,"exec getemployees ?sex",’employees’)
select employees
brow
查詢女員工
csex=’女’
sqlexec(nhandle,"exec getemployees ?sex",’employees’)
select employees
brow
這時brow得到的cursor你會發現,雖然修改了表中的數據,但伺服器上並沒有被更新.
這是因為spt得到的游標默認是可寫但不可更新的。
設定本地表可更新伺服器表
sqlexec(jb,"select id,bh,hyzhm,fzdw,rghsj,ghzrsj,xm,xb,gs_bm from rsda where lcbj=0 order by gbbh","gh")
***設定gh可更新rsda表
sele gh
cursorsetprop("tables","rsda","gh") &&設定臨時表的更新目標表
cursorsetprop("keyfieldlist",’id’,"gh") &&設定臨時表的關鍵字
cursorsetprop("updatablefieldlist","id,fzdw,rghsj,ghzrsj,hyzhm","gh")&&設定臨時表的更新欄位
cursorsetprop("updatenamelist","id rsda. id,hyzhm rsda.hyzhm,rghsj rsda.rghsj,ghzrsj rsda.ghzrsj,fzdw rsda.fzdw","gh")
&&&用gh中的相應欄位更新rsda表
cursorsetprop("sendupdates",.t.,"gh")&&設定為可更新
cursorsetprop("wheretype",2)
cursorsetprop("buffering",5)&&設定表緩衝
順便提一下,表緩衝必須有明確的tableupdate命令才能更新。
上面的功能都是通過本地的cursor來處理遠程數據。spt還可以直接處理遠程數據。
如將遠程伺服器上的表rsda中,性別為男的,都改成女的。
sqlexec(nhandle,"update rsda set xb=’女’ where xb=’男’")&&由於這句是更新命令,不需要返回一個記錄集,所以,第
三個參數,游標名可以省略不寫。
由此也就可以舉一反三的明白,如何調用遠程存儲過程來更新數據了。
如將上面的更新語句寫成存儲過程
在伺服器上
create proc updatesex
as
update rsda set xb=’女’ where xb=’男’
go
vfp調用
sqlexec(jb,"exec updatesex")&&調用存儲過程,不需要返回游標,取消第三個參數
如何開始一個遠程事務
事務它包含一個可回滾的操作段。在sql server上在事務中的數據,並沒有實際的寫入資料庫,而是將更新臨時存儲在
緩衝中,只有明確的發出了commit或者rollback tran才結束這個事務,將操作取消或者將操作實際寫入。
每個事務以begin tran開始,以commit tran或者rollback tran結束。倘若在遺漏了commit tran或者rollback tran,在sql server就很容易的表現為等待狀態,即死鎖狀態,在等待該事務的釋放。
開始一個事務:
sqlexec(nhandle,"begin tran")&&開始一個事務,事實上sqlexec()中的第二個參數中的操作都是被傳送到sql server執行的。這樣也就可以理解存儲過程的一個優點,因為存儲過程只要傳送一個調用語句給伺服器,而如果將這些語句全部寫在
VFP端,則帶來的網路傳送量必然很多,客戶端越多,造成網路阻塞的可能就越大。回到事務上來。
sqlexec(nhandle,"insert into tablename values()")
sqlexec(nhandle,"if @@error<>0")
sqlexec(nhandle,"begin")
sqlexec(nhandle,"rollback tran")
sqlexec(nhandle,"return")
sqlexec(nhandle,"end")
sqlexec(nhandle,"delete from tablename where ")
sqlexec(nhandle,"if @@error<>0")
sqlexec(nhandle,"rollback tran")
sqlexec(nhandle,"else")
sqlexec(nhandle,"commit tran")
當然在vfp8中可以寫成text endtext的形式更加直觀
不過我個人感覺,有事務處理的處理還是最好寫成過程。例在伺服器上建立過程
create proc procname
as
begin tran
insert into tablename values()
if @@error<>0
begin
rollback tran
return
end
delete from tablename where
if @@error<>0
rollback tran
else
commit tran
在vfp端sqlexec(nhandle,"exec procname")
當然也可以開啟伺服器事務
* 開始一個 VFP 事務處理和一個伺服器上的事務處理.
nConnection=CursorGetProp("ConnectHandle","mytable")
SQLExec( nConnection, ‘BEGIN TRANSACTION’ )
* 更新修改到 MyTable.
lEverythingOK = Tableupdate( 2, .F., ‘mytable’ )
If lEverythingOK
* 更新修改到 MyOtherTab

相關詞條

熱門詞條

聯絡我們