多文件类型与本地缓存
如果要在二进制列要插入任意类型的文件,那么我们必须增加一列,用于存储所插入文件的后缀名。
同样为了提高运行效率,可以在插入文件的时候,同时在数据库中存储所插入文件的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()