VFP在國內主要流行vfp6.0.
VisualFoxPro6.0能夠得到廣泛的使用,這是與其具有的強大的功能分不開的,VisualFoxPro6.0與其前期的版本相比,有更高的性能指標和鮮明的特點。
(1)提供多種可視化編程工具,最突出的是面向對象編程。
(2)在表的設計方面,增添了表的欄位和控制項直接結合的設定。
除此之外,VisualFoxPro6.0具有一系列的新特色,如:
(1)成功解決了計算機2000年的問題。
(2)增強了Internet技術和WWW資料庫的設計。
(3)ActiveX和嚮導、生成器及控制項等集成化工具。
(4)新引入了網路圖象檔案格式:gif和jpeg。
⒈對項目及資料庫控制的增強在VisualFoxPro6.0中可以藉助“項目管理器”創建和集中管理應用程式中的任何元素;可以訪問所有嚮導、生成器、工具列和其他易於 使用的工具。
⒉提高應用程式開發的效率
VisualFoxPro6.0增加了面向對象的語言和方式。藉助VisualFoxPro6.0的對象模型,可以充分使用面向對象程式設計的所有功能。
⒊互操作性和支持Internet
VisualFoxPro6.0支持具有對象的連結與嵌入(OLE)拖放,可以在VisualFoxPro6.0和其他應用程式之間,或在VisualFoxPro6.0應用程式內部移動數據。
⒋充分利用已有數據
VisualFoxPro6.0為升級資料庫提供了一個方便實用的轉換器工具,可以將早期版本中的數據移植過來使用;對於電子表格或文本檔案中的數據,VisualFoxPro6.0也 可以方便的實現數據共享。
VFP概述
Visual FoxPro ,是Microsoft公司從Fox公司的FoxBase資料庫軟體經過數次改良,並且移植到Windows之後,得來的應用程式開發軟體,主要用於開發數據管理與運算等方面的軟體。
FoxBase採用命令行方式(為了和當時流行的資料庫軟體dBASE兼容……)但是速度比當時其他的資料庫軟體要快。
VFP是Microsoft公司推出的可視化資料庫管理系統平台,(vfp6.0在國內較為流行,Microsoft於1998年發布)是功能特彆強大的32位資料庫管理系統。它提供了功能完備的工具、極其友好的用戶界面、簡單的數據存取方式、具有良好的跨平台特性,它可以運行於Windows95/98/2000/XP/Visita/7等作業系統之上,良好的兼容性、真正的可編譯性和較強的安全性,是目前最快捷、最實用的資料庫管理系統軟體之一。
Visual FoxPro成長之路
Visual FoxPro(以下簡稱VFP)是個不斷成長的小伙,承蒙Visual Studio(以下簡稱VS)的關照,VFP在開發者心目中一直是和VB、VC地位相同的工具語言,只不過它並不是通用開發工具,而只是專注於資料庫套用的開發。 然而,吊足大家胃口的VS.NET終於出現在開發者面前時,竟不見了VFP的身影,著實引起開發社區的一陣騷動。微軟不要VFP了?不是,恰恰相反,VFP忍受不了VS緩慢的升級速度,“單幹”了。現在的VFP已經升級到版本9,並且完全支持.NET技術。
以下讓我們來一起關注一下VFP的成長之路,看看每次升級VFP都為我們帶來了那些誘人的新特徵。
VFP 6
VFP6.0是由微軟公司於1998年在推出Windows98作業系統的同時推出的。
1998年9月份美國微軟公司推出了VisualFoxPro6.0系列,其中包括VFP6。VFP6的推出為網路數據系統使用者及設計開發者帶來了極大的方便。VFP6不僅提供了更多更好的設計器、嚮導、生成器及新類,並且使得客戶/伺服器結構資料庫應用程式的設計更加方便簡捷,增加了處理2000年數據的工具。VFP6以其強健的工具和面向對象的以數據為中心的語言,將客戶/伺服器和網路功能集成於現代化的、多連結的應用程式中。VFP6充分發揮了面向對象編程技術與事件驅動方式的優勢。VFP6是目前世界流行的小型資料庫管理系統中版本最高、性能最好、功能最強的優秀軟體之一。
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的原始碼。 至此,我們可以遺憾的發現,Visual Foxpro 已經完全失去主流研發支持了。
需要注意
SPT的全稱為SQLPass-Through,它和遠程視圖(RemoteView)、CA(CursorAdapter,VFP8及後序版本支持)共同構成了VFP實現資料庫操作的利器。遠程視圖及CA實質上都是基於SPT技術,與它們相比,SPT要更為靈活,它可以直接創建資料庫接連,執行資料庫原生SQL語句,並可以獲取臨時表(Cursor),通過設定能使對臨時表的更改更新到資料庫表中。SPT的缺點是不面向對象、代碼量大。
與資料庫建立連線
VFP可以通過SQLCONNECT()函式或SQLSTRINGCONNECT()函式可以和任何支ODBC驅動的資料庫建立連線,成功建立連線後將返回一個大於0的整數型句柄,如果連線失敗則會返回-1。通過這個句柄我們可以用SQLEXEC()函式向資料庫傳送SQL語句,最後需要調用SQLDISCONNECT()函式斷掉連線。
例1:假設已存在一個名稱為MyNewDB的數據源,用戶名是sa,密碼是admin,使用SQLCONNECT()函式創建資料庫連線。
LOCALlnHandle
lnHandle=SQLCONNECT("MyNewDB","sa","admin")
?"已成功創建資料庫連線,連線句柄是:",lnHandle
=SQLDISCONNECT(lnHandle)
例2:連線位於192.168.0.100的某台SQLServer資料庫伺服器上的MyNewDB資料庫,,用戶名是sa,密碼是admin,使用SQLSTRINGCONNECT()函式創建資料庫連線。
LOCALlcConnStr,lnHandle
lcConnStr="Driver=SQLServer;Server=192.168.0.100;"+;
:Database=MyNewDB;UID=sa;PWD=admin"
lnHandle=SQLSTRINGCONNECT(lcConnStr)
IFlnHandle>0
=MESSAGEBOX("資料庫連線成功。",64,"提示信息")
=SQLDISCONNECT(lnHandle)
ELSE
=MESSAGEBOX("資料庫連線失敗。",48,"提示信息")
ENDIF
如何向伺服器取數據
在第一步建立和伺服器資料庫的連線,並取得連線句柄nhandle後
sqlexec(jb,"select*fromtablename","cursorname")
如何向伺服器取數據
如向伺服器表employees查詢性別為男的人員
在第一步建立和伺服器資料庫的連線,並取得連線句柄nhandle後
sqlexec(nhandle,"select*fromemployeeswheresex=’男’","employees")
selectemployees
brow
也可以調用系統上的存儲過程來取得數據.
如在伺服器建立存儲過程
createprocgetmanofworkes
as
select*fromemployeeswheresex=’男’
go
然後在vfp里調用
sqlexec(nhandle,"execgetmanofworkes",employees)
selectemployees
brow
當然也可以想存儲過程傳遞參數查詢
仍然以剛才的例子,查詢不同性別的員工
在伺服器上建立createprocgetemployees
@sexchar(2)=’男’
as
select*fromemployeeswheresex=@sex
go
vfp里調用
查詢男員工
csex=’男’
sqlexec(nhandle,"execgetemployees?sex",’employees’)
selectemployees
brow
查詢女員工
csex=’女’
sqlexec(nhandle,"execgetemployees?sex",’employees’)
selectemployees
brow
這時brow得到的cursor你會發現,雖然修改了表中的數據,但伺服器上並沒有被更新.
這是因為spt得到的游標默認是可寫但不可更新的。
設定本地表可更新伺服器表
sqlexec(jb,"selectid,bh,hyzhm,fzdw,rghsj,ghzrsj,xm,xb,gs_bmfromrsdawherelcbj=0orderbygbbh","gh")
***設定gh可更新rsda表
selegh
cursorsetprop("tables","rsda","gh")&&設定臨時表的更新目標表
cursorsetprop("keyfieldlist",’id’,"gh")&&設定臨時表的關鍵字
cursorsetprop("updatablefieldlist","id,fzdw,rghsj,ghzrsj,hyzhm","gh")&&設定臨時表的更新欄位
cursorsetprop("updatenamelist","idrsda.id,hyzhmrsda.hyzhm,rghsjrsda.rghsj,ghzrsjrsda.ghzrsj,fzdwrsda.fzdw","gh")
&&&用gh中的相應欄位更新rsda表
cursorsetprop("sendupdates",.t.,"gh")&&設定為可更新
cursorsetprop("wheretype",2)
cursorsetprop("buffering",5)&&設定表緩衝
順便提一下,表緩衝必須有明確的tableupdate命令才能更新。
上面的功能都是通過本地的cursor來處理遠程數據。spt還可以直接處理遠程數據。
如將遠程伺服器上的表rsda中,性別為男的,都改成女的。
sqlexec(nhandle,"updatersdasetxb=’女’wherexb=’男’")&&由於這句是更新命令,不需要返回一個記錄集,所以,第
三個參數,游標名可以省略不寫。
由此也就可以舉一反三的明白,如何調用遠程存儲過程來更新數據了。
如將上面的更新語句寫成存儲過程
在伺服器上
createprocupdatesex
as
updatersdasetxb=’女’wherexb=’男’
go
vfp調用
sqlexec(jb,"execupdatesex")&&調用存儲過程,不需要返回游標,取消第三個參數
如何開始一個遠程事務
事務它包含一個可回滾的操作段。在sqlserver上在事務中的數據,並沒有實際的寫入資料庫,而是將更新臨時存儲在
緩衝中,只有明確的發出了commit或者rollbacktran才結束這個事務,將操作取消或者將操作實際寫入。
每個事務以begintran開始,以committran或者rollbacktran結束。倘若在遺漏了committran或者rollbacktran,在sqlserver就很容易的表現為等待狀態,即死鎖狀態,在等待該事務的釋放。
開始一個事務:
sqlexec(nhandle,"begintran")&&開始一個事務,事實上sqlexec()中的第二個參數中的操作都是被傳送到sqlserver執行的。這樣也就可以理解存儲過程的一個優點,因為存儲過程只要傳送一個調用語句給伺服器,而如果將這些語句全部寫在
VFP端,則帶來的網路傳送量必然很多,客戶端越多,造成網路阻塞的可能就越大。回到事務上來。
sqlexec(nhandle,"insertintotablenamevalues()")
sqlexec(nhandle,"if@@error<>0")
sqlexec(nhandle,"begin")
sqlexec(nhandle,"rollbacktran")
sqlexec(nhandle,"return")
sqlexec(nhandle,"end")
sqlexec(nhandle,"deletefromtablenamewhere")
sqlexec(nhandle,"if@@error<>0")
sqlexec(nhandle,"rollbacktran")
sqlexec(nhandle,"else")
sqlexec(nhandle,"committran")
當然在vfp8中可以寫成textendtext的形式更加直觀
不過我個人感覺,有事務處理的處理還是最好寫成過程。例在伺服器上建立過程
createprocprocname
as
begintran
insertintotablenamevalues()
if@@error<>0
begin
rollbacktran
return
end
deletefromtablenamewhere
if@@error<>0
rollbacktran
else
committran
在vfp端sqlexec(nhandle,"execprocname")
當然也可以開啟伺服器事務:
*開始一個VFP事務處理和一個伺服器上的事務處理.
nConnection=CursorGetProp("ConnectHandle","mytable")
SQLExec(nConnection,‘BEGINTRANSACTION’)
*更新修改到MyTable.
lEverythingOK=Tableupdate(2,.F.,‘mytable’)
IflEverythingOK
*更新修改到MyOtherTab
VFP中的SQL命令CREATETABLE
1.CREATETABLE-SQL命令
該命令的一般格式為:
CREATETABLE|dbf<表檔案名稱>(欄位名1欄位類型[(欄位寬度[,小數位數])][,欄位名2欄位類型[(欄位寬度[,小數位數])]]……)
例:CREATETABLExscj(xhc(8),xmc(6),xbc(2),;cjn(5,1),ksrqd)
2.ALTERTABLE-SQL命令功能
命令格式示例
添加欄位ALTERTABLExscjADDCOLUMNkcmcC(14)
重命名欄位ALTERTABLExscjRENAMECOLUMNkcmcTOkc
刪除欄位ALTERTABLExscjDROPCOLUMNkc
3.INSERT-SQL命令
該命令的一般格式為:
INSERTINTO<表名>[(欄位名1[,欄位名2…])]VALUES(表達式1[,表達式2…])
例:INSERTINTOxscj(xh,xm,cj)VALUES("81991001","張良",85.5)
4.UPDATE-SQL命令
命令格式:UPDATE<表名>SET欄位1=表達式1[,欄位2=表達式2…];
WHERE條件表達式
例:UPDATExscjSETcj=cj*1.05WHEREcj>80
5.DELETE-SQL命令
命令格式:DELETEFROM<表名>[WHERE條件表達式]
例:DELETEFROMxscjWHEREcj<60
6.SELECT-SQL命令創建查詢
常用的格式:
SELECT表名1.欄位名1[AS標題名1],表名1.欄位名2[AS標題名2],…
FROM資料庫名!表名1[,資料庫名!表名2][,資料庫名!表名3]
[TOFILE文本檔案名稱|intotable|intocursor表檔案名稱]
[WHERE選定條件]
[GROUPBY分組欄位名]
[HAVING分組中的滿足條件]
[ORDERBY排序欄位名1[ASC|DESC][,排序欄位名2[ASC|DESC]...]]
示例:
瀏覽學生中的查詢學生student.qpr:
SELECT表xs.xhas學號,表xs.xmas姓名,表xs.xbas性別,;
表xs.csrqas出生日期,表xs.bjas班級名稱;
FROM數據test!表xs;
WHERE表xs.bj=cs1;
ORDERBY表xs.xh;
INTOTABLExs
瀏覽成績中的按課程查詢sub_cj.qpr:
SELECT表xs.bjas班級名稱,COUNT(表xs.xh)as班級人數,AVG(表cj.cj)as平均分,;
MAX(表cj.cj)as最高分,MIN(表cj.cj)as最低分;
FROM數據test!表xs,數據test!表cj,數據test!表kc;
WHERE表cj.xh=表xs.xh;
AND表kc.kcm=表cj.kcm;
AND表cj.kcm=sc1;
GROUPBY表xs.bj;
ORDERBY表xs.bj;
INTOTABLEsub_cj
7.CREATESQLVIEW命令創建視圖
打開資料庫,用命令來創建視圖:
OPENDATABASE資料庫名
CREATESQLVIEW視圖檔案名稱ASSQL-SELECT語句
例:OPENDATABASESJ
CREATSQLVIEWSCOREASSELECTSJCJ.XH,SJCJ.CJ;
FROMSJ!SJCJWHERESJCJ.KCH=”計算機基礎”
8.CREATETABLE-SQL命令創建資料庫表
命令一般格式:
Createtable表名1[free](欄位名1欄位類型代號[(欄位寬度[,小數位數])][null|notnull][check欄位規則1[error“信息1”]][default默認值][primarykey|unique][references表名2[tag索引標識1]][,欄位名2欄位類型代號[(欄位寬度[,小數位數])][null|notnull]][check欄位規則2[error“信息2”]][default默認值])|fromarray數組名
使用示例:
creatdataxscjgl&&創建學生成績管理資料庫
createtablexs(;
xhc(4)default"1201"primarykey,;
xmc(6),;
xbc(2)checkxb="男"orxb="女"error"性別只能是男或女"default"女",;
nln(2)null;
)&&創建學生表
createtablekc(;
kchc(3)unique,;
kcmc(10),;
xfn(3,1),;
bxkl;
)&&創建課程表
createtablecj(;
xhc(4)default"1201"referencexstagxh,;
kchc(8),;
ksrqd,;
cjn(5,1);
)&&創建成績表
modidata
altertablecjaddprimarykeyxh+kch+str(cj,4,1)tagdh&&為成績表添加一個主索引