Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 用于读取文件,然后将其写入SQL Server BLOB列,生成具有不同字节的文件的代码_Sql Server_Vba_Odbc_Dao_Ms Access 2013 - Fatal编程技术网

Sql server 用于读取文件,然后将其写入SQL Server BLOB列,生成具有不同字节的文件的代码

Sql server 用于读取文件,然后将其写入SQL Server BLOB列,生成具有不同字节的文件的代码,sql-server,vba,odbc,dao,ms-access-2013,Sql Server,Vba,Odbc,Dao,Ms Access 2013,使用: MS-SQL Server 2014 MS Access 2013,将ODBC表链接到SQL数据库 服务器数据库 “SQL Server”ODBC驱动程序(10.00.10586.00,Microsoft 公司,SQLSRV32.DLL) 刀 我们有一个Access数据库,它将ODBC表链接到SQL Server 2014数据库,在Access应用程序中的表单后面有VBA代码,用于将文件上载到SQL Server blob(varbinary[max])列,然后从同一blob列下载该

使用:

  • MS-SQL Server 2014
  • MS Access 2013,将ODBC表链接到SQL数据库 服务器数据库
  • “SQL Server”ODBC驱动程序(10.00.10586.00,Microsoft 公司,SQLSRV32.DLL)
我们有一个Access数据库,它将ODBC表链接到SQL Server 2014数据库,在Access应用程序中的表单后面有VBA代码,用于将文件上载到SQL Server blob(varbinary[max])列,然后从同一blob列下载该文件

但是,我们发现,在检索之前从blob列上载的文件时,保存的文件在文件末尾添加了一些额外的字节

下面是Beyond Compare中2个文件比较的屏幕截图:

如果有人能检查并指出代码中的错误,我将不胜感激。代码如下:

函数ReadBLOB(SourceFileName作为字符串,TableName作为字符串,FieldName作为字符串_
IDFieldName作为字符串,IDFieldValue作为变量)
Dim NumBlocks为整数,SourceFile为整数,i为整数
变暗文件长度为
暗淡的剩菜
Dim FileData()作为字节
Dim RetVal作为变体
大小与长度相同
像线一样变暗
On Error GoTo Err_ReadBLOB
块大小=32767
'打开源文件。
SourceFile=FreeFile
打开SourceFileName进行二进制访问,读取为SourceFile
'获取文件的长度。
FileLength=LOF(源文件)
如果FileLength=0,则
ReadBLOB=0
退出功能
如果结束
'计算要读取的块数和剩余字节数。
NumBlocks=FileLength\BlockSize
剩余=文件长度Mod BlockSize
将T设置为dao。记录集
如果TypeName(IDFieldValue)=“字符串”,则
IDFieldValue=“”&IDFieldValue&“”
如果结束
s=“从[”&TableName&“]中选择[”&FieldName&“],其中[”&idfiedname&“]=”&idfiedvalue
Set T=CurrentDb.OpenRecordset(s、dbOpenDynaset、dbSeeChanges)
编辑
'读取第一个数据块(最大剩余大小),将其写入表中。
'FileData=String$(剩余,32)
重拨文件数据(剩余)
获取源文件、文件数据
T(字段名).AppendChunk(文件数据)
'读取剩余的数据块,并将其写入表中。
'FileData=String$(块大小,32)
ReDim文件数据(块大小)
对于i=1到1
获取源文件、文件数据
T(字段名).AppendChunk(文件数据)
接下来我
'更新记录并终止函数。
T.更新
关闭源文件
ReadBLOB=FileLength
退出功能
Err_ReadBLOB:
ReadBLOB=-Err
MsgBox错误说明
退出功能
端函数
函数WriteBLOB2(TableName为字符串,FieldName为字符串,IDFieldName为字符串_
IDFieldValue作为变量,DestinationFileName作为字符串)作为长度
Dim NumBlocks为整数,DestFile为整数,i为整数
变暗文件长度与长度相同,剩余文件长度与长度相同
Dim FileData()作为字节
Dim RetVal作为变体
大小与长度相同
像线一样变暗
作为字符串的Dim f
On Error GoTo Err_WriteBLOB
块大小=32767
将T设置为dao。记录集
如果TypeName(IDFieldValue)=“字符串”,则
IDFieldValue=“”&IDFieldValue&“”
如果结束
s=“从[”&TableName&“]中选择[”&FieldName&“],其中[”&idfiedname&“]=”&idfiedvalue
Set T=CurrentDb.OpenRecordset(s、dbOpenSnapshot、dbSeeChanges)
如果T.RecordCount=0,则
WriteBLOB2=0
退出功能
如果结束
'获取字段的大小。
FileLength=T(FieldName).FieldSize()
如果FileLength=0,则
WriteBLOB2=0
退出功能
如果结束
'计算要写入的块数和剩余字节数。
NumBlocks=FileLength\BlockSize
剩余=文件长度Mod BlockSize
'删除任何现有的目标文件。
DestFile=FreeFile
打开DestinationFileName以作为DestFile输出
关闭文件
'打开目标文件。
打开二进制文件的DestinationFileName作为DestFile
'将剩余数据写入输出文件。
FileData=T(FieldName).GetChunk(0,剩余)
放置文件、文件数据
'将剩余的数据块写入输出文件。
对于i=1到1
'读取块并将其写入输出文件。
FileData=T(FieldName).GetChunk((i-1)*块大小+剩余的块大小)
放置文件、文件数据
接下来我
'终止函数
关闭文件
WriteBLOB2=文件长度
退出功能
Err_WriteBLOB:
WriteBLOB2=-Err
MsgBox错误说明
退出功能
端函数
Public Sub ClearSQLBlob2(表名为字符串,字段名为字符串_
IDFieldName作为字符串,IDFieldValue作为变量)
如果TypeName(IDFieldValue)=“字符串”,则
IDFieldValue=“”&IDFieldValue&“”
如果结束
DoCmd.SetWarnings错误
DoCmd.RunSQL“UPDATE[”&TableName&“]SET[”&FieldName&“]=NULL,其中[”&IDFieldName&“]=”&IDFieldValue
DoCmd.SetWarnings True
端接头
我认为问题在于:

除非模块中有
选项Base 1
声明,否则数组是基于零的

因此,如果例如,
剩余物
=2

ReDim文件数据(剩余)
将实际声明一个数组
FileData(0到2)
,该数组包含3个字节。因此下面的
Get
将读取3个字节,但您希望它读取2个字节

对于全尺寸阵列也是如此

最后,从文件中读取的
NumBlocks+1
字节太多,剩余的将是
00
字节

解决方案:使用

ReDim文件数据(1到剩余)
ReDim文件数据(1到块大小)

编辑:请注意,您必须检查案例
LeftOver=0

删除所有非essen将有助于