⑴ 如何在ASP中通過ODBC調用Excel中的數據
在ASP中通過ODBC調用Excel中的數據方式和普通的通過ODBC調用資料庫的方式有一些不同的地方。下面將介紹如何通過ODBC在ASP中使用Excel的數據。
在使用的過程中,要注意的是你需要使用的ODBC驅動為:Microsoft ODBC Driver for Excel.
下面給出一個例子來具體說明如何調用的過程:
1。在Excel的電子表格中新建一個叫Range的表單
a)在Excel文件ADOtest.xls中的sheet1里隨便輸入下面的測試數據:
column1 column2 column3
rr this 15
bb test 20
ee works 25
[b]注意事項[/b]:
如果你的Excel電子表格中某一列同時包含了文本和數字的話,那麼Excel的ODBC驅動將不能夠正常
處理這一行的數據類型,你必須要保證該列的數據類型一致。:
i.Microsoft OLE DB Provider for ODBC Drivers error '80040e21'
The request properties can not be supported by this ODBC Driver.
ii.Microsoft OLE DB Provider for ODBC Drivers error '80004005'
The query is not updateable because it contains no searchable columns to use as a
hopeful key.
iii.Microsoft OLE DB Provider for ODBC Drivers error '80004005'
Query based update failed. The row to update could not be found.
b)使用滑鼠選中你的數據所在的所有行和列
c)從菜單中選擇InsertNameDefine命令.
d)輸入myRange1,然後單擊OK退出
[b]注意事項[/b]:
i)ADO假設Excel中的第一行為欄位名.所以你定義的范圍中必須要包括第一行的內容
ii)Excel中的行標題(即欄位名)不能夠包含數字. Excel的驅動在遇到這種問題時就會出錯的。
例如你的行標題名為「F1」
e)新建一個ODBC系統DSN指向這個ADOTest.xls文件:(這個過程我就不詳細說了)
[b]注意事項[/b]:
i)DSN中要選擇Access97版本
ii)在NT中設置好匿名帳號對該電子表格文件相應的訪問許可權
iii)如果你的許可權設置不正確的話,有可能會得到如下出錯信息:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Excel Driver] The Microsoft Jet database engine
cannot open the file '(unknown)'. It is already opened exclusively
by another user, or you need permission to view its data.
f)最後一步,就是在ASP中調用這個ODBC,代碼如下:
<%@ LANGUAGE="VBSCRIPT" %>
<%
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "ADOExcel"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.ActiveConnection = objConn
objRS.CursorType = 3
objRS.LockType = 2
objRS.Source = "Select * from myRange1"
objRS.Open
%>
<br>
<%
Response.Write("Original Data")
Response.Write("<TABLE><TR>")
For X = 0 To objRS.Fields.Count - 1
Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>")
Next
Response.Write("</TR>")
objRS.MoveFirst
While Not objRS.EOF
Response.Write("<TR>")
For X = 0 To objRS.Fields.Count - 1
Response.write("<TD>" & objRS.Fields.Item(X).Value)
Next
objRS.MoveNext
Response.Write("</TR>")
Wend
Response.Write("</TABLE>")
objRS.MoveFirst
objRS.Fields(0).Value = "change"
objRS.Fields(1).Value = "look"
objRS.Fields(2).Value = "30"
objRS.Update
Response.Write("<br>Data after the update")
Response.Write("<TABLE><TR>")
For X = 0 To objRS.Fields.Count - 1
Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>")
Next
Response.Write("</TR>")
objRS.MoveFirst
While Not objRS.EOF
Response.Write("<TR>")
For X = 0 To objRS.Fields.Count - 1
Response.write("<TD>" & objRS.Fields.Item(X).Value)
Next
objRS.MoveNext
Response.Write("</TR>")
Wend
Response.Write("</TABLE>")
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
⑵ 用ASP寫EXCEL資料庫的連接參數怎麼寫
vb下可以使用的連接:
MyXLSConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";Extended Properties=""Excel 8.0;HDR=Yes;"";"""
MyXLSRs.Open "Select * from [Sheet1$]", MyXLSConn, adOpenDynamic, adLockOptimistic
你的錯誤應該是表名稱問題使用[sheet1$]
adOpenDynamic = 2
adLockOptimistic = 3
ado打開excel是有限制的,以上方法在vb上測試通過
在asp應該沒問題,你把表名改掉,將方式由1,1改為2,3
⑶ 如何將excel數據通過asp導入資料庫
將excel數據通過asp導入資料庫:
參考代碼:
wenjian=request.Form("floor")
fileext=mid(wenjian,InStrRev(wenjian,".")+1)
if lcase(fileext)<>"xls" then
response.write "<script>alert ('文件格式不對,請上傳Excel文件');window.location.href='updateFloor.asp';</script>"
response.end
end if
set conne=server.CreateObject("ADODB.Connection")
connStre="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath( ""&wenjian&"" )&";Extended Properties='Excel 8.0;HDR=YES;IMEX=1';"
conne.open connStre
Sqle="select * from [sheet1$] "
Set rse = Server.CreateObject("ADODB.Recordset")
rse.open sqle,conne,1,1
'驗證
hang=2
do while not rse.eof
'名稱不能為空
if trim(rse(0))<>"" then
else
mess="第"& hang &"行名稱為空,請檢查!"
response.Write"<script>alert('"& mess &"').window.location.href='updateFloor.asp'</script>"
response.End()
end if
rse.movenext
hang=hang+1
loop
rse.movefirst
do while not rse.eof
set rst=server.CreateObject("adodb.recordset")
sqlt="select * from Sellman"
rst.open sqlt,conn,1,3
rst.addnew()
rst("CompanyName")=c2(rse(0))
rst("CompanyInfo")=c2(rse(1))
rst("address")=c2(rse(2))
rst("tel")=c2(rse(3))&" "&c2(rse(7))
rst("Fax")=c2(rse(4))
rst("linkman")=c2(rse(5))
rst("Homepage")=c2(rse(8))
rst("Email")=c2(rse(6))
rst.update()
rst.close
set rst=nothing
rse.movenext
loop
rse.close
set rse=nothing
response.Write "<script>alert('導入成功!');location.href='updateFloor.asp';</script>"
⑷ asp添加到excel數據時,超鏈接要添加怎麼弄
下面是asp連接excel的代碼:
<%
dim conn,cnstr
cnstr="DBQ="+Server.MapPath("你的excel文件.xls")+";DefaultDir=;DRIVER={Microsoft Excel Driver (*.xls)};"
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open cnstr
%>
連接上之後,就可以像操縱其它資料庫一樣操縱excel了,xls文件的每一個sheet頁面就相當於一個表,但注意在引用的時候需要在之後加上一個$,比如說查詢Sheet1頁面的所有數據,sql語句就是:
select * from [Sheet1$]
至於你所說的超鏈接怎麼弄,不明白你指的是什麼,如果是想傳值到保存頁面,應該這么寫:
<%
response.write "<a href=save.asp?name=張三&sex=男&age=21>保存</a>"
%>
如果樓主不是這個意思,請再補充說明。
⑸ 關於ASP連接Excel資料庫無法更新的問題
為什麼會有Visual FoxPro 要淘汰的傳聞呢,我不是很清楚。但這兩年微軟對Visual FoxPro的不宣傳態度卻是為這股謠言起到了推波助瀾的作用。另外Visual FoxPro 確實是一個容易引起誤會的產品,初級用戶很容易對它產生「不怎
我們說Visual FoxPro是面向對象化的語言,是有根據的。面向對象化的語言必須具備四個特性:抽象(Abstraction)、封裝(Encapsulation)、繼承(Inheritance)、多態(Polymorphism)。對照一下Visual FoxPro,是不是支持這四大特性!
當然,Visual FoxPro 與C++和Object Pascal 一樣都是歷史悠久的語言,所以語言中有很多面向過程的語素。我知道很多學校在教學中,只是教導學生們使用Visual FoxPro的面向過程的語言特色,而忽視了面向對象的教學,同樣的問題也存在於廣大的 Visual FoxPro 程序員中。我們必須明白:不能因為我們沒有使用Visual FoxPro面向對象的強大功能,而說Visual FoxPro不是面向對象的語言,這就像不能因為天下雨、沒有出太陽,而說太陽被天狗吃掉了——多麼的幼稚可笑!
我們知道Visual FoxPro對數據的操作沿用了多年來的面向過程的做法,這與現在流行的開發工具有很大的不同。我覺得,微軟這樣做是有它的道理的:
第一,面向過程的數據處理,更能發揮XBase語言體系的靈活與隨意的特色。這一點,你用過其他的資料庫開發工具,然後再用用Visual FoxPro就明白了。
第二,不直接提供面向對象的數據處理組件,不代表不允許用戶封裝自己的數據處理組件。很多優秀的 Fox程序員,都會自己封裝專門數據處理組件,這才是Visual FoxPro編程的高尚境界!
面向記錄與面向集合之爭
根據筆者的淺薄認知,關系型資料庫處理可以分為面向記錄操作和面向集合操作。
各種開發工具支持的客戶端游標體系就是面向記錄操作的,它們支持記錄之間的絕對定位,更明白地說就是可以在記錄之間導航,諸如:SKIP、GO TOP之類的語句。Visual FoxPro 無疑是此道的絕對高手,20年的語言發展,聚集了大量面向記錄的語言要素。這是因為這樣,我們才會反復強調:Visual FoxPro的Cursor 體系靈活、強大!
各類大型資料庫,如Oracle、SQL Server 是面向集合處理的代表,看看正統的SQL 語言,絕對沒有數據導航之說,數據記錄之間是平等的,一切都要講關系、擺條件!
隨著技術的發展,人們開始注意到,不能分割這兩種對數據的操作方式,於是大型資料庫支持了游標語素,Fox也支持符合規范的SQL 語言。
產品定位導致Visual FoxPro變化不易為人們感覺。微軟要把Visual FoxPro作為三層構架(或是多層構架)的中間層開發工具。
什麼是三層構架呢?第一層是用戶界面:它包含了用戶界面,讓使用者輸入,輸出,查詢等工作;第三層是資料層:它就是用來放資料的地方,一般是指後端資料庫,主要有包括 Oracle、SQL Server 等,它主要是提供一個很大的地方,來有規則的存放數據;第二層是商務邏輯層(中間層):有人要說了:存取資料,直接從第一層跳到第二層可不可以?當然可以,沒有人規定不能走捷徑,而且從資料庫直接抓資料,既快又好,那為什麼搞出個第二層呢?
商務規則是經常變化的,比如上班從8 點改為10 點,那電腦怎那麼知道老闆因為不景氣少讓大家上二個小時班呢?它一定無法知道,你必須告訴它,這時問題就來了,如果你有很多部電腦,例如:100 台,你就得一部部換新程序。如果這是一個掛在Internet上的網路程序,難道總讓用戶download新程序不成?
更重要的是,在大量客戶存在的環境里,傳統的兩層構架根本沒有能力承擔巨大的工作壓力,必須通過某種中間系統實現壓力平衡,這就是中間層的另一妙用!
中間層是沒有圖形界面設計的代碼編寫,並且是OOP方式的代碼編寫,不僅要熟悉後台資料庫的特性,還要考慮前台界面工具的特性,最重要的是商務邏輯的構架,同時還要求懂得IIS、MTS(COM+)、NT的安全設置等復雜枯燥的東西。有趣的是,近年來 Visual FoxPro 的各種改進,更多的是在這些方面下功夫,到了最新版本的Visual FoxPro 7 更是在此方面增加了若干特性,下面就讓我用四個問題來說明Visual FoxPro 在開發中間層方面的貢獻:
問題一:Visual FoxPro能開發出穩定、有效率的Server程序嗎?能,在1999年發布的Visual FoxPro SP 3中微軟賦予了Visual FoxPro開發多線程進程的內組件的能力,並增加了新的運行時刻庫VFPnT.DLL(n代表版本號),支持其運行,在這個運行庫中,刪除了大量老式的和界面控制元素,使得它更小巧。但是由於Visual FoxPro6本身不是很穩定(加打SP4或SP5才有所改善),所以這個很棒的功能在Visual FoxPro 6下並不能充分發揮,直到Visual FoxPro 7出現才使它的顯示出英雄本色!
問題二:分布式的事務、動態負載平衡怎麼實現?Visual FoxPro 7對COM+有很好的支持,藉由COM+就可以解決這兩個問題了!
問題三:作為Server程序,客戶程序怎樣與Server交換數據集合?這是Visual FoxPro 6開發的Server程序的致命弱點,我們知道Visual FoxPro是用來處理數據的,但不能與外界自由交換數據集合會大大降低開發、使用以及程序運行效率!在Visual FoxPro 7里我們XML就可以快速、輕易的傳遞大型數據集合,真正做到數據集的來去自由。現在回想Visual FoxPro 6中我們用的那種「循環+屬性」的做法,真有天上與人間的感受!
問題四:能不能讓Visual FoxPro開發的Server任由客戶使用,叫干什麼就干什麼?可以的,在Visual FoxPro 7里提供了一個全新的函數:ExecScript()。有了它,就可以一次執行多條客戶端送來的符合Visual FoxPro規范的語句:你可以定義變數、做查詢、更新數據、修改表結構……
微軟確實實踐著讓Visual FoxPro在中間層運行的承諾。但遺憾的是:由於國內用戶的水平、國內軟體應用的領域,對大多數Fox Fans 無法感受Visual FoxPro日新月異的變化——對他們來說,Visual FoxPro確實「沒有改變」!
Visual FoxPro 只能局限於桌面應用程序的開發嗎?
技術在進步,軟體技術的應用不斷在拓寬,Internet 已經是眾多開發工具競相支持的應用領域。Visual FoxPro 從版本 5 開始不斷擴充對Internet的支持,到最新的Visual FoxPro 7 更是增加了對Web Service的支持。我們可以把Visual FoxPro 對Internet的支持分為三大部分:
第一,簡單的HTML的轉換。Visual FoxPro 自帶的「Web 發布」就是這類型的工具,利用HTML和DHTML的模版,支持Visual FoxPro數據的Web化,這是一種全靜態的 Web 支持。
第二,適合於企業內部使用的 Active Document 技術。是不是希望快速、簡單的把Visual FoxPro應用程序轉變為Web 應用程序,這個Active Document 技術就是最佳的選擇。它支持 App 程序運行在IE中,它的缺點是:在客戶端必須安裝Visual FoxPro的運行庫、客戶端與資料庫間依然是緊密的有狀態的關系,屬於F/S構架——只是界面能夠運行在IE之中了。它的開發快速以及它依然基於傳統構架,決定了這個技術只能運行在企業內部,一般不能在廣域網路中發布。
這技術是Visual FoxPro 6提出的,當時在 Tool 菜單里還有一個專門的菜單項。到了而今的Visual FoxPro 7,這個菜單項已經取消了,但並不是說Visual FoxPro 7 不支持Active Document,只是這種並不出色的技術沒有必要再放在醒目的位置了。
第三,基於COM 的 Web 應用。
Visual FoxPro 真正能被用於Web 開發,就是通過 COM 支持的。
這里您要有個認識,作為資料庫開發工具,Visual FoxPro 不是FronPage這樣的用於開發Web 界面的工具(也許未來的 Visual FoxPro 會支持 Web 界面的開發)。Visual FoxPro 完全是作為 Server 運行在網站的後台,為各種應用提供服務。使用 Visual FoxPro 編寫的 COM 組件能夠被IIS支持,壓在後台進行各種運作——這就是真正意義上的Visual FoxPro 的Web應用,也是典型的多層構架的中間層!
這個階段,Visual FoxPro 對 Web的支持有可以劃分為三個層次:
FoxISAPI。
這是最先登場的技術,當年 ASP 技術還沒有出現的時候,我們在 IIS 里就可以通過 ISAPI 技術實現動態網頁開發。
Web Server
ASP 技術出現了,我們知道 ASP 技術的一大特色就是支持伺服器端的組件的應用。用 Visual FoxPro 的編寫的 COM 組件就能運行在 IIS 里,供 ASP 調用。
Web Service
這是 Visual FoxPro 7 的新特性,也是當前最熱門的技術。它與Web Service的最大不同就是:Web Server 組件只能通過 ASP 程序調用,而Web Service可以供任何系統在全球范圍調用,無論客戶端的硬體平台、軟體平台,只要它支持SOAP、支持XML就可以了。
更誇張一點說:只要能上網,就可以享用 Web Service 提供的服務!
有人也許會問:我可以用VB、VC++建立對象組件時,為何我要用Visual FoxPro 來建立相同的組件? 微軟對這一問題有專門的評論,大意為:快、重復使用性、跨語言重復使用性。「快」是指用Visual FoxPro開發的組件擷取、處理資料都極為迅速,並且Visual FoxPro能夠非常迅速的建立字元串。到底有多快,我想數據處理、存取的速度大家平時都領教過了,字元串生成速度我這里有個數據不妨一看,這是台灣的一位高手做的試驗——將1M的數據寫入文本中,結果VC++ 6.0程序用了3.5秒、VB 6.0程序用了11秒、Java 1.1.5用了24秒、Visual FoxPro 6.0用了7秒;「重復使用性」是指Visual FoxPro具備OOP的功能;「跨語言重復使用性」是指Visual FoxPro編寫的對象編譯以後成為COM、COM+對象組件,這樣就可以在其他語言中使用它了。
不要以為Visual FoxPro是「低端產品",無論從資料庫(DBF Base)品質還是開發環境評價Visual FoxPro,它都是一個「高端工具」。
許多人認為Visual FoxPro只能用來開發單用戶系統或是文件伺服器構架的小型網路系統——這是謬誤——這種無知的言論在許多講C/S、三層構架的書中都有(特別是一些VB、PB、Delphi的資料庫編程書)。我可以很負責任的告訴大家完全可以用Visual FoxPro開發C/S結構的系統。這里說的C/S構架絕對是正宗的,不是用什麼F/S構架在糊弄大家。在C/S構架中我們常常選擇Visual FoxPro作為客戶端開發工具,以Oracle、SQL Server等網路資料庫壓在後台,使用Visual FoxPro內置的Remote View和SPT技術,這樣就可以完美地解決問題。這里不能詳細展開,只特別介紹Visual FoxPro的本地引擎在開發中的作用。Visual FoxPro的本地引擎特別強大(上文我們說過處理百萬條記錄不費吹灰之力),我們在設計系統時可以十分簡單的將遠程數據與本地數據結合,很簡單、很有效地控制網路數據流量、提高系統工作效率(我看過不少VB、Delphi、PB的書,他們很少在怎樣控制網路數據流量、提高系統工作效率論述,不知是不屑一顧,還是其他什麼原因)。
我認為Visual FoxPro的本地引擎在C/S構架下起碼有三項偉大的用途。其一:非經常變動數據的本地存儲。我國的郵政編碼與地區的關系是相對穩定的數據,而且數據量也不是太小,我想總有上千個記錄(我沒仔細考察過具體情況),我們把這些信息存儲在客戶端的計算機中,就可以在使用郵政編碼及其相關信息時從本地得到數據,這樣能使高系統效率同時節省網路資源(這是C/S開發的重要原則),只在郵政編碼發生變化時在伺服器上統一更新,下載更新客戶機上的數據。如果用別的軟體實現同樣的功能,絕對比Visual FoxPro麻煩而且效果絕對不及Visual FoxPro,這因為Visual FoxPro的數據引擎直接支持遠程數據讀取,能很好的融合本地數據與遠程數據;其二:離線數據包。單位里總有人出差,在千萬里路之外能不能拿著筆記本為客戶發訂單、與客戶簽合同,就像在自己的辦公室一樣?當他回到公司時只要把筆記本連到伺服器中,發送更新就行了。Visual FoxPro的離線視圖是經濟且高效安全的方案(當然您可以使用遠程撥入或建一個Web網站,這些Visual FoxPro可能幹)。其實離線數據包還有一個重要的功能:當下載的數據是大量的(除非萬不得已請不要這樣設計系統),這種情況下使用離線視圖可以數據集自動轉化為物理表,充分利用Visual FoxPro的高速與靈活,完成後連線更新後端數據源——一切都很簡單。我認為:離線視圖絕對是Visual FoxPro在C/S系統中的一個賣點,雖然ADO也支持類似的東西,但肯定不及Visual FoxPro有效率;其三:數據驅動。您是否知道,Visual FoxPro中絕大多數文件格式實際上都是DBF文件,如DBC、SCX、FRX等,他們都可以由Visual FoxPro的本地引擎驅動完成復雜的任務。在設計C/S結構時如果要存儲用戶設置、自定義文件格式,用Visual FoxPro的本地引擎幫忙絕對比其他軟體簡單,因為你用的是換湯不換葯的方法,但它簡單、有效率。
Visual FoxPro 開發C/S系統時,最與眾不同的特色就是對遠程數據的操控是通過本地資料庫來實現的,Remote View、Connection都作為本地資料庫的對象被管理起來,完美的銜接本地數據與遠程數據。這種在客戶端建立遠程數據邏輯的做法,與最新的ADO.NET有相似之處!
在三層構架中,Visual FoxPro可以充當任意一層的任務,但本人以為大中型系統的資料庫部分應以網路資料庫為主。客戶端界面用Visual FoxPro也是可以的,但一般限於企業內部,在Internet上我們通常使用IE作為客戶界面。在三層構架中Visual FoxPro最勝任中間層的開發,它簡單(開發難度與普通的Visual FoxPro項目相差不大)、快速的字元串生成、支持COM技術、它支持(MTS)COM+技術、它支持XML(Visual FoxPro 7.0提供3個與XML有關的函數)、它具有強大本地數據引擎、靈活的數據處理方式、它支持多線程的服務組件的開發。
可能有人要問:用ASP+腳本語言一樣可以開發Web系統,何必加個中間層。的確,目前在市面上與多討論Web的書都直接使用腳本語言來開發整個系統,這是十分不正確的做法,甚至有寫書還說硬體越來越快,因此使用腳本語言來開發整個系統並沒有什麼關系。會說出這樣話的作者通常都是沒有實際開發Web應用經驗的人。腳本語言,如VBScript是一種解釋性語言,運行效率很低,他們只合適作為膠水程序。開發Web系統正統的做法是:把應用邏輯編寫成COM、DCOM對象,然後用少量的腳本語言來驅動/使用這些對象。這樣系統開發時工作量會大一些,但它符合開發任何資料庫應用程序的最基本的原則:分離應用邏輯與用戶界面。這樣系統就會變的容易維護了——你可以經常變換那些膠水程序來改變Web頁面,應用邏輯變換時你又可以改變某一個邏輯對象,而不用為雜亂且關系復雜的代碼發愁。再者,由於Visual FoxPro是高效、靈活的數據處理語言,任何商業邏輯都可以用它來代碼化,並且您可以獲得幾十倍甚至上百倍於ASP+腳本語言的運行效率,以及更為強健的執行效果。
Visual FoxPro 的語言看上去蠻難的。
人們在贊揚 Visual FoxPro 始終是褒揚他的易學易用,我不同意這種觀點(我不知道他們站在什麼立場上說話)。我看問題的角度是「成為一名還過得去的 Visual FoxPro 程序員」,我的結論是Visual FoxPro 作為一個開發工具並不是好學的。這不是說Visual FoxPro的語法、概念像C那麼繁復,而是指:即使是簡單的應用,也要掌握很多Visual FoxPro的概念、語法、函數,可能還要較深入了解OOP——往往讓人摸不到深淺。比如,拿資料庫系統最重要的功能——查詢來講,Visual FoxPro就「花樣繁多」。我曾統計過,不算「List、Browse"等互動式命令,Visual FoxPro起碼支持4條命令(Find,Seek,Locate,Select-SQL)、3個函數(Lookup(),Seek(),Indexseek()),(當然其中有的已經淘汰)這些命令的關鍵字、函數的參數眾多,有的要求索引, 有的可以用索引但要求優化索引……而這在VB、Delphi中絕對就只是兩三個方法的事情。從上面的例子中如果您只看到了Visual FoxPro的繁雜,那麼您就完全錯了:在VB、Delphi實現查詢功能的原理與Visual FoxPro應是一樣的,但他們封裝了許多環節,而Visual FoxPro就把許多東西更低階(當然不如VC++那麼低層次,但是已經比使用對象的語言難多了)的展示給我們,所以Visual FoxPro的開發者往往比使用其他的開發工具開發者更會思考、更懂得的資料庫開發的真諦,因為工具逼迫他們朝這個方向努力……
用Visual FoxPro有助於提高程序員對資料庫概念的理解。許多在Visual FoxPro程序員中不是問題的問題往往成為那些使用對象處理數據的程序員的噩夢。比如在Visual FoxPro中數據緩沖、事務處理都是重要的概念(事實上要幹活就必須了解這些東西),在其他開發環境中一味強調方便快速往往忽視程序員的基本概念培養,編出的東西要麼效率不高、要麼老出問題。讀書人都懂得:基本概念、基本理論是命根子,這就是Visual FoxPro帶給我們的好處。
有趣的是Visual FoxPro繁、難也就到這個程度了 ,他的學習難度曲線是所有語言中最平穩的——不像在有些語言中,基礎開發十分容易,一旦深入卻難度很高。在Visual FoxPro中初級應用、中級應用、高級應用的難度差異很小——就是那些似曾相識的語句、易於理解的函數。Visual FoxPro的這種高級應用不太難,初級應用不十分容易的特性,對初入門者來講是無法體會其中的妙處的,這就造成了Visual FoxPro的不太友好形象;
同時,Visual FoxPro的難度卻帶來了很多的好處(前文我已談了很多),Visual FoxPro比其他語言在數據處理上更快速、更靈活,數據處理方式更多、更完備。設想一下用Visual FoxPro開發數據對象時,我們可以使用豐富多彩的語句、函數,實現十分復雜、變化多端的功能,用其他語言開發數據對象,它們的功能只能是建立在已有的數據對象的功能之上(這叫繼承),變化就少了,功能就弱了。如果要實現Visual FoxPro的Xbase+SQL 那樣靈活、強大的功能恐怕要使用底層的API了——這太可怕了!
OOP不僅是指「面向對象」的開發環境,更是一種開發思想、開發技術,Visual FoxPro 在後者上做得更好。
我們講過Visual FoxPro完全支持OOP的開發,但有趣的是在數據處理方面,微軟實際上沒有提供什麼現成的對象(FFC是Visual FoxPro 6.0才有的,且封裝性、適應性都不盡如人意),這一點我不知是Visual FoxPro的福氣還是禍害。說「福氣」這將逼迫程序員掌握這門並不太簡單的技術(可能用「思想方法」更恰當),而不是簡單地使用對象。OOP對於中間層的開發來講是很重要的,因為COM組件必須是建立在OOP思想上的,要開發這種組件就必須掌握OOP技術;講「禍害」這使Visual FoxPro變得不易於學習和使用了(就我個人而言,真正體會到「用Visual FoxPro應會編制數據處理對象」這一問題也是在使用了Visual FoxPro好長時間之後的事情了)。事實上現在很多誹謗攻擊Visual FoxPro的人都沒有深刻的認識這一問題——他們只感到Visual FoxPro用起來不及Delphi、PB、VB容易,但他們從不想該怎樣開發數據處理對象,到編寫COM組件時就要他們的命了。那些「精英們」大多不懂OOP,他們只懂「點」操作符號——彷彿對象的使用就是OOP,他們有什麼資格來批評我們呢?
Visual FoxPro的界面能力真的很差嗎?
我認為作為資料庫系統的開發工具微軟為我們提供的那些內置控制項加上十幾個附送的ActiveX控制項已經夠用了。
我們討論Visual FoxPro控制項應從兩方面入手,第一就是界面美觀問題,再就是數據處理、分析是否方便。很多人很在意的前一個問題,我倒是不以為然——控制項不多特別是美化界面的控制項不多並不代表Visual FoxPro就開發不出賞心悅目的軟體,我的感受是軟體界面的專業化程度、高級別的審美、整體的效果要比個別的界面特效重要千萬倍,實際效果可要好上千萬倍。看看國外用Visual FoxPro編制的程序您就會明白這個道理了;我對Visual FoxPro的不滿在於數據處理、分析控制項不全,特別是缺少了一批數據分析控制項。比如沒有可以與數據捆綁的圖表控制項、沒有可以列示捆綁交叉表的表格控制項、沒有可以捆綁數據的數據透視表格控制項……在這個問題上Visual FoxPro確實應該向Delphi、PB等軟體學習,這是我們對未來的Visual FoxPro的期望!
Visual FoxPro與OLE DB、ADO
ADO是Windows環境下主流的數據存取的解決方案,那些以對象操作數據的語言基本上都使用ADO實現數據存取,如:VC++、VB、Delphi。在Visual FoxPro的開發環境中好像看不到ADO的影子,是不是Visual FoxPro不支持ADO呢?ADO其實是一組COM對象,Visual FoxPro支持COM,當然支持ADO。
我認為:Visual FoxPro對ADO的支持只是停留在較低的水平。這並不是說Visual FoxPro限制了什麼ADO的功能(所有功能都能用),而是指:用起來不方便,不像在VB、Delphi中方便。這種不方便主要體現在ADO的Recordset無法與Visual FoxPro的內置控制項捆綁。其原因是:Visual FoxPro 不認識ADO的Recordset,只能將記錄逐條讀取,而不是一下子認得整個Recordset。這樣數據就不能被捆綁了,同時也不能對ADO直接使用Visual FoxPro強大的數據處理功能(ADO是用來存取數據而處理數據還要靠客戶軟體)。
就象Visual FoxPro使用ODBC連接遠程數據源那樣,ADO通過OLE-DB與數據提供者對話。 (By the way: Visual FoxPro 7是OLE-DB提供者,這樣就可以 通過正宗的OLE-DB驅動程序在其他開發工具中使用ADO存取Visual FoxPro數據了 。)
ADO能為Visual FoxPro帶來什麼?首先要注意的是:ADO與Visual FoxPro的數據引擎是毫無關系的系統,從某種程度上講ADO的出現為Visual FoxPro提供了一種全新的遠程數據處理方式。
ADO是多層應用程序中數據集合傳遞的最好解決方案。如果我們用Visual FoxPro開發了一個中間層系統,用VB開發了用戶界面,當中間層要傳遞一個cursor到VB的客戶端就不可以使用Visual FoxPro的cursor或DBF,因為VB不認得他們。使用ADO的Recordset就可以解決問題,因為大家都認得他;Visual FoxPro 只能通過Visual FoxPro 7支持XML後才能彌補Visual FoxPro本地引擎在應用程序傳遞數據集的不足。
ADO可以存取非關系型資料庫。ADO是微軟的Universal Data Access構架的主將,它可以存取Excel等非關系型數據資料庫的數據。通過ODBC存取遠程數據的Visual FoxPro就無此能力了。但是我使用了ADO存取Excel後很失望,因為連接必須是獨占的,所以這種功能帶給我們的幫助只是有限的!
ADO可以彌補Visual FoxPro在遠程數據存取時的不足之處。譬如Visual FoxPro不認得SQL Server中nText、nVarchar、nChar等數據類型,但ADO可以。
在Visual FoxPro使用ADO存在如下缺點:
Visual FoxPro只能通過COM的方式識別ADO的Recordset,不能像表格那樣讀寫它,這樣就出現了兩個問題:Recordset無法與Visual FoxPro的內置控制項捆綁;無法直接使用Visual FoxPro強大的數據處理功能(ADO是用來存取數據而處理數據還要靠客戶軟體)。
Visual FoxPro中使用代碼實現ADO的全部功能,但代碼量大、書寫麻煩。
對待以上不足Visual FoxPro開發小組在Visual FoxPro 6推出不久後就發布了一個叫VFPCOM.DLL的組件,可以用它部分解決ADO的Recordset與Visual FoxPro的cursor的轉換和ADO事件的綁定 ,Visual FoxPro 更是內置支持 COM 事件綁定。在本文的第一版中,筆者曾有這樣的希望:「Visual FoxPro 更具效率的支持ADO」。現在我的看法有了一些改變,我認為在 Visual FoxPro 處理數據,無論是本地、還是遠程數據,無論是什麼構架的系統,最佳的解決方案認識內置的數據引擎,而不是現在流行的ADO,現在 Visual FoxPro對ADO的支持程度已經足夠了!
Visual FoxPro的數據引擎與ADO相比有什麼優勢呢?
Visual FoxPro數據引擎系統資源耗用小,ADO畢竟是COM組件要花用更多的資源。
作為系統共用組件,使用ADO可能會在不同應用系統中產生ADO的版本問題,這就像我們常遇見的ActiveX的控制項版本問題。
ADO只是數據存取組件,它沒有數據處理功能,要處理數據必須使用客戶應用程序,如VB、Delphi。Visual FoxPro數據引擎同時支持數據存取、數據處理,我已多次強調Visual FoxPro在這兩方面的偉大功能;
ADO沒有本地資料庫作為強大的支持,有需要將遠端數據暫時存放在物理文件中ADO絕對不及Visual FoxPro。Visual FoxPro的資料庫是桌面資料庫中最好的,遠端數據暫存其中不僅方便,而且伸縮性強。