我正在使用以下tcl代码将我的deskstop中的文件存储到Sqlite数据库中作为blob数据($fileText
是文本文件的路径):
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?
答案 0 :(得分:1)
当您说“以PDF格式打开”时,我认为您的意思是您希望某些外部程序将数据视为文件?唯一的方法是:
还将它作为一个网络服务器呈现,但这真的是第二个与浏览器混合;数据仍然被复制。
另一方面,如果您要做的就是将数据作为可以从Tcl读取或写入的流,那么sqlite3包就可以满足您的需求:
dbcmd incrblob ?-readonly? ?db? table column rowid
返回标准通道句柄(虽然没有一个由OS句柄备份,因此如果使用exec
作为重定向时要小心。)
[编辑]:以下是如何获取数据(当然,用一个子句替换...
以获得正确的行):
# 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