一、問題的提出
最近一個專案中遇到ASP對FoxPro函式庫表(*.DBF)的操作問題。現實中確有許多應用軟體使用DBF表,如何在網路環境中使用這些數據,讓許多朋友一籌莫展。
本人也查了許多資料,沒有找到解決方法的詳細說明。經過試驗,初步解決了這個問題,拿出來和大家分享。
本文試圖解決以下問題:
1. ASP聯結由FoxPro 產生的自由表(*.dbf檔)
2. 將多種類型的資料及圖形檔案同時存入dbf表中
(範例程式可從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;"
我用此連接字符串沒有連接成功,沒有進行進一步測試,有興趣的朋友可以試試以上字符串。
.www.downcodes.com
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!