2010-05-17 46 views
1

我使用下面的tcl代碼從我deskstop文件存儲到SQLite數據庫的BLOB數據($fileText是一個文本文件的路徑):開幕BLOB數據存儲在SQLite作爲一個文件的Tcl/Tk

sqlite3 db Docs.db 
set fileID [open $fileText RDONLY] 
fconfigure $fileID -translation binary 
set content [read $fileID] 
close $fileID 
db eval {insert into Document (Doc) VALUES ($content)} 
db close 

我發現了很多關於如何打開blob數據以讀取和寫入數據的資源,但是我無法找到關於將blob數據作爲文件打開的資源。例如,如果$ fileText是pdf,我將如何從Sqlite打開它作爲pdf?

回答

1

當你說「打開爲PDF」時,我假設你的意思是你想要一些外部程序將數據看作一個文件?唯一的方法可以做到這要麼是:

  1. 不要在Linux(或您的OS上的等價物)用戶模式文件系統一些聰明有心計,這樣的數據庫可以是實際安裝,或
  2. 將數據複製從數據庫轉換爲具有正確名稱的臨時文件(提示:將其保存爲該表中的單獨列)。

還有一切都是作爲網絡服務器來呈現的,但這真的是第二個使用瀏覽器的組合;數據仍然被複制。

在另一方面,如果你想要做的是有數據的,你可以閱讀或Tcl的編寫的流時,sqlite3的包有你需要的東西:

dbcmdincrblob ?-readonly? ?db? table column rowid

它返回一個標準通道句柄(儘管不是由操作系統句柄備份的句柄,因此如果使用exec作爲重定向,請小心)。


[編輯]:下面是如何getthe數據輸出(該條款得到正確的行替換...,當然):

# Open the DB 
sqlite3 db Docs.db 

# Open the file to write to 
set fileID [open $fileText w] 
fconfigure $fileID -translation binary 

# Write the BLOB 
db eval {SELECT Doc FROM Document WHERE ... LIMIT 1} row { 
    puts -nonewline $fileID $row(Doc) 
} 

# We're done! 
close $fileID 
db close 

不要擔心BLOB的大小; Tcl sqlite3包可以有效地傳遞它。如果你還在擔心,這裏的其他方式(同樣,你需要適當地更換...):

# Open the DB 
sqlite3 db Docs.db 

# Open the file to write to 
set fileOut [open $fileText w] 
fconfigure $fileOut -translation binary 

# Get the BLOB as a (read-only) channel 
set fdBlob [db incrblob -readonly Document Doc ...] 
fconfigure $fdBlob -translation binary 

# Do the copy 
fcopy $fileOut $fdBlob 

# We're done! 
close $fdBlob 
close $fileOut 
db close 
+0

唐納德嗨 - 感謝您的反饋意見。我希望開發一個tcl tk前端,允許最終用戶上傳pdf文件(到sqlite),然後能夠下載pdf的使用情況,如標準文件數據庫。上傳部分似乎很簡單,使用二進制/ blob數據。我可能會做錯事。打開一個I/O通道是我的唯一選擇blob數據還是可以將數據打開爲文件,類似於從Web驅動的Db打開文件? – DFM 2010-05-17 20:24:29

+0

@DFM:SQLite將BLOB保存在數據庫中,因此直接打開它作爲文件不會起作用(當然,並不是沒有像我的答案的第1點那樣令人討厭的黑客)。複製出來。注意:拷出只有幾行代碼。 – 2010-05-17 20:35:17

+0

嗨唐納德 - 複製數據出來工作得很好。作爲一個測試,而不是put ...,我將它複製到文本框小部件中,因爲我沒有使用shell。我發現複製PDF或Word文檔blob數據給我無法識別的字符,最有可能是因爲格式。我如何將這些數據編譯回pdf或Word文檔? – user175328 2010-05-18 14:02:22

相關問題