ASP對FoxPro自由表(DBF檔案)的操作

來源:互聯網
上載者:User
 

一、問題的提出
    最近一個項目中遇到ASP對FoxPro庫表(*.DBF)的操作問題。現實中確有許多應用軟體使用DBF表,如何在網路環境中使用這些資料,使很多朋友一籌莫展。
    本人也查了許多資料,沒有找到解決方案的詳細說明。經過實驗,初步解決了這個問題,拿出來和大家分享。
    本文試圖解決以下問題:
    1. ASP聯結由FoxPro 產生的自由表(*.dbf檔案)
    2. 將多種類型的資料及圖形檔案同時存入dbf表中
    (樣本程式可從http://www.netop.cc/downloads/dbf.rar得到)

二、環境
   Windows2000 + IIS5.0 + IE6.0(SP1)
   DBF檔案為Microsoft Visual FoxPro 6.0 產生的自由表(非dbc庫)

三、解決途徑
1. 串連
   DBF檔案的ODBC驅動程式名稱為 Microsoft Visual FoxPro Driver,在ASP中,通過Connection對象與其聯結,需要注意的是,聯結時將DBF所在目錄視為庫名。以下是具體聯結代碼:
   
   DIM conn,connstr,db
   db="data"
   Set conn = Server.CreateObject("ADODB.Connection")
   connstr = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;"&_
                 "SourceDB=" & Server.MapPath(db) &";Exclusive=No"
   conn.Open connstr

   以上代碼中,data為我的DBF檔案所在的相對路徑(相對於此代碼所在的檔案),通過Server.MapPath(db)將其轉為絕對路徑。
   http://www.connectionstrings.com 給出了很多類型的庫表檔案的串連字串,其中對DBF檔案,給出的串連字串為:
   "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\mydbpath;" 
   我用此串連字串沒有串連成功,沒有進行進一步測試,有興趣的朋友可以試一下以上字串。

2. 在SQL語句中聲明表名
   可以用[表名]或[表名.副檔名]的形式在SQL語句中聲明要操作的表名,如表檔案名稱為t1.dbf,SQL語句為:
   select * from [t1]  或  select * from [t1.dbf]

3. 各種類型資料的入庫操作
   DBF支援的資料類型不是很多,其中值得注意是的Date(日期型)、Memo(備忘型)、General(通用型)。在此著重說明一下Data型資料,Memo及Gen型在儲存圖形檔案時用到,稍後說明。
   我一般採用兩種方式進行寫庫操作,一種是使用insert語句,一種是使用addnew方法,對於DBF表,這兩種方式略有差別。
   使用insert語句時,要注意Date型資料的書寫格式為{^yyyy-mm-dd},分界符不同於Access的#及SQL Server的'。具體SQL語句為:
   insert into [t1.dbf] (name,birthday) values ('MyName',{^1970-1-1})
   在使用addnew方法時,我原先使用的代碼為:

   rst.open "[t1]",conn,0,3
   rst.addnew
   rst(0).value = "MyName"
   rst(1).value = {^1970-1-1}
   rst.update
   rst.close
   
   在對SQL Server及Access操作時都沒有問題,但是對DBF檔案操作時出現了問題。經過實驗,終於找到了正確的方法:
   
   sql = "select * from t1"
   rst.open sql,conn,0,3
   rst.addnew
   rst(0).value = "MyName"
   rst(1).value = {^1970-1-1}
   rst.update
   rst.close

   請注意以上兩段代碼的差別,主要在SQL語句上。前面說過,在SQL語句中,可以用[表名]或[表名.dbf]的方式聲明表檔案,但在使用addnew方法時,表名不可帶副檔名,而且不可加方括弧,否則會提示“非簡單表名,不可更新” 。

4. 圖形檔案的儲存
   DBF表中,備忘形及通用型欄位都可用於儲存圖形、音像、文本等檔案(請參考http://www.chinadesign.com.cn/NewsContents1.asp?id=2663)。在這裡,我們將欄位類型設為memo(binary)(二進位備忘型),使用rst(n).AppendChunk()方法將得到的圖片位元據寫入,使用Response.BinaryWrite()方法將位元據還原為圖片。圖片入庫的相關文章很多,在此不再贅述。
   至於使用General(通用型)欄位儲存圖片,我試了一下,沒有成功,也就沒有再試。

5. 資料的刪除
   可以使用delete語句將資料刪除,但是刪除後開啟表檔案,探索資料只是做了刪除標記,並未真正從表中刪除。在Foxpro中,要使用pack命令將資料永久刪除。查了些資料,說是VB無法實現pack操作,那VBS當然更無法實現了。一般的解決辦法是每隔一段時間,將表中的資料(當然是未做刪除標記的)匯入一新表,刪除原表,再將新表改名為原表名。

6. 資料和圖片同時入庫
   這個問題不屬於本文要討論的範圍,網上也有很多文章給出瞭解決辦法,這裡順帶說一下。
   我是利用“化境”無組件上傳程式實現的這個功能。有些朋友會問,“化境”上傳是寫成檔案,沒有入庫的方法啊。不錯,但是稍加改動,可以得到圖片的位元據,然後入庫即可。我的樣本中,化境程式改動的部分都做了注釋,請參考。

四、結語
    本文主要討論ASP對DBF自由表的操作,如果是DBC庫,樣本中的inc/conn.asp中給出了相應的串連字串。
    至此,相信朋友們對DBF表的操作有了大概的瞭解,結合我的樣本,相信大家可以開發出更多的功能。
    GOOD LUCK!



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。