VB+ADO的方法:Private Function DatabaseToFile(ByVal DataField As ADODB.Field, ByVal vSaveAs As String, ByVal vFileExpendName As String) As String Dim fnum As Long, bytesleft As Long, bytes As Long Dim lSumSize As Long, lNowSize As Long Dim tmp() As Byte On Error GoTo ErrHandleDatabaseToFile If Trim(vSaveAs) = "" Then DatabaseToFile = GetTempFileName(vFileExpendName) Else DatabaseToFile = Trim(vSaveAs) End If
fnum = FreeFile Open (DatabaseToFile) For Binary As fnum bytesleft = DataField.ActualSize
lSumSize = CLng(bytesleft / 8192)
Do While bytesleft bytes = bytesleft If bytes > 8192 Then bytes = 8192 tmp = DataField.GetChunk(bytes) Put #fnum, , tmp bytesleft = bytesleft - bytes lNowSize = lNowSize + 1 RaiseEvent TransmitData(lNowSize, lSumSize, False) Loop Close #fnum Exit Function ErrHandleDatabaseToFile: DatabaseToFile = "" Err.Clear End FunctionPrivate Function FileToDatabase(ByVal vDataField As ADODB.Field, ByVal vFileName As String) Dim fnum As Long, bytesleft As Long, bytes As Long Dim lSumSize As Long, lNowSize As Long Dim tmp() As Byte On Error GoTo ErrHandleFileToDatabase
fnum = FreeFile Open vFileName For Binary As fnum bytesleft = LOF(fnum) lSumSize = CLng(bytesleft / 8192) Do While bytesleft bytes = bytesleft If bytes > 8192 Then bytes = 8192 ReDim tmp(1 To bytes) As Byte Get #fnum, , tmp vDataField.AppendChunk tmp bytesleft = bytesleft - bytes lNowSize = lNowSize + 1 DoEvents RaiseEvent TransmitData(lNowSize, lSumSize, True) Loop
Close #fnum
Exit Function ErrHandleFileToDatabase: Err.Clear End Function
二进制数据由十六进制数表示。例如,十进制数 245 等于十六进制数 F5。在 Microsoft® SQL Server™ 2000 中,二进制数据使用 binary、varbinary 和 image 数据类型存储。指派为 binary 数据类型的列在每行中都是固定的长度(最多为 8 KB)。指派为 varbinary 数据类型的列,各项所包含的十六进制数字的个数可以不同(最多为 8 KB)。image 数据列可以用来存储超过 8 KB 的可变长度的二进制数据,如 Microsoft Word 文档、Microsoft Excel 电子表格、包含位图的图像、图形交换格式 (GIF) 文件和联合图像专家组 (JPEG) 文件。除非数据长度超过 8KB 时用 image 数据类型存储,一般宜用 varbinary 类型来存储二进制数据。建议列宽的定义不超过所存储的二进制数据可能的最大长度。
1.利用系统的文件共享办法,将需要的文档放在共享目录下,然后分配和数据库系统一样的操作权限,但是这样的话,似乎给系统管理造成难度,而且与数据库系统不协调,太脱节!
2.利用数据库存储,先用代码将文档读出后,存入数据库中,在需要的时候,再用代码读出来,存到本地,格式为.doc的,再使用Word打开。但也不理想???
不知道是否可行,大家给我点意见!也请高手指教有更好的办法?
Dim fnum As Long, bytesleft As Long, bytes As Long
Dim lSumSize As Long, lNowSize As Long
Dim tmp() As Byte
On Error GoTo ErrHandleDatabaseToFile
If Trim(vSaveAs) = "" Then
DatabaseToFile = GetTempFileName(vFileExpendName)
Else
DatabaseToFile = Trim(vSaveAs)
End If
fnum = FreeFile
Open (DatabaseToFile) For Binary As fnum
bytesleft = DataField.ActualSize
lSumSize = CLng(bytesleft / 8192)
Do While bytesleft
bytes = bytesleft
If bytes > 8192 Then bytes = 8192
tmp = DataField.GetChunk(bytes)
Put #fnum, , tmp
bytesleft = bytesleft - bytes
lNowSize = lNowSize + 1
RaiseEvent TransmitData(lNowSize, lSumSize, False)
Loop
Close #fnum
Exit Function
ErrHandleDatabaseToFile:
DatabaseToFile = ""
Err.Clear
End FunctionPrivate Function FileToDatabase(ByVal vDataField As ADODB.Field, ByVal vFileName As String)
Dim fnum As Long, bytesleft As Long, bytes As Long
Dim lSumSize As Long, lNowSize As Long
Dim tmp() As Byte
On Error GoTo ErrHandleFileToDatabase
fnum = FreeFile
Open vFileName For Binary As fnum
bytesleft = LOF(fnum)
lSumSize = CLng(bytesleft / 8192)
Do While bytesleft
bytes = bytesleft
If bytes > 8192 Then bytes = 8192
ReDim tmp(1 To bytes) As Byte
Get #fnum, , tmp
vDataField.AppendChunk tmp
bytesleft = bytesleft - bytes
lNowSize = lNowSize + 1
DoEvents
RaiseEvent TransmitData(lNowSize, lSumSize, True)
Loop
Close #fnum
Exit Function
ErrHandleFileToDatabase:
Err.Clear
End Function
一:只是保存word的地址在数据库里.
二:把word内容保存在数据库中,可以用image字段.
如果开发工具是pb,可以用ole,调用ole_1.Activate(OffSite!)
可把该内容在word中打开,直接update该image字段,保存
修改内容.
DELPHI中用
TFormatfield(fields[doc]).loadfromfile('文件.doc');
将.doc文件存到SQL SERVER的image字段
用TFormatfield(fields[doc]).SAVETOFILE('文件.doc');将.doc文件从数据库读出来。
具体你去查相应的编程语言的帮助,用loadfromstream,savetostream也可以。不只.doc,
.bmp,.rtf等都可以存到IMAGE字段保存;sql server2000的IMAGE字段还能对.doc文件进行
全文检索.
我将开始实现,具体可能还要依据我的实际情况!
谢谢!