多文件类型与本地缓存
如果要在二进制列要插入任意类型的文件,那么我们必须增加一列,用于存储所插入文件的后缀名。
同样为了提高运行效率,可以在插入文件的时候,同时在数据库中存储所插入文件的crc校验值;从数据库中提取文件之前,先判断本地是否存在此文件,如果存在,则将本地文件的crc校验值和数据库中的存储的crc校验值进行比较,如果相等,则直接使用本地文件,否则从数据库中提取文件。
后缀名和crc校验值可以存储在同一个列中。
设计过程:
1、数据库库中有两列,分别是附件列和信息列,附件列是二进制列,用于存储文件本身,信息列是字符列,用于存储文件的后缀名和crc校验值。
2、增加外部表的时候,将附件类和信息列排除,不要加载到Foxtable中。
3、插入文件的参考代码:
If
Tables("员工").Current
Is Nothing
Then
    Return
End 
If
Dim
dr As
DataRow = Tables("员工").Current.DataRow
If
dr.RowState 
= DataRowState.Added
Then 
'如果是新增行,必须先保存才能插入文件
    dr.Save()
End 
If
Dim
dlg As
New 
OpenFileDialog
dlg.Filter 
= 
"图形文件|*.bmp;*.jpg;*.gif;*.png"
If
dlg.ShowDialog 
=DialogResult.OK
Then
    Dim fl
As String =
dlg.FileName
    Dim ex
As String =
fl.SubString(fl.LastIndexOf(".") 
+ 1) '获取文件后缀名
    ex = ex
& "|"
& CRCCheckFile(fl)
'将后缀名和文件的crc校验值组合成一个字符串
    dr.SQLInsertFile("附件",fl)
'插入文件
    dr.SQLSetValue("信息",ex)
'将文件的后缀名和crc校验值保存在信息列
End 
If
4、打开文件的参考代码:
If
Tables("员工").Current
Is Nothing
Then
    Return
End
If
Dim dr As
DataRow = Tables("员工").Current.DataRow
Dim pts()
As String =
dr.SQLGetValue("信息").Split("|")
Dim
fl As
String =  
ProjectPath & 
dr("_Identify")
& "."
& pts(0)
If FileSys.FileExists(fl)
AndAlso CRCCheckFile(fl) 
= pts(1)
Then 
'如果本地存在同名文件且CRC校验值相同
   
'则直接使用本地文件
Else
'否则从数据库提取文件
   
If dr.SQLLoadFile("附件",fl) 
= False Then
'如果提取文件失败
       
Messagebox.Show("附件提取失败,可能并不存在附件!",
"提示",
MessageBoxButtons.OK,
MessageBoxIcon.Information)
        Return
    End If
End If
Dim Proc As
New Process
'打开文件
Proc.File 
= fl
Proc.Start()