Access 2007,VBA:将BLOB插入链接表时出现奇怪的错误

问题描述 投票:0回答:1

尝试将二进制文件插入varbinary列时出现一个奇怪的错误。体系结构如下:

具有此表对象的SQL Server 2008数据库:

CREATE TABLE [dbo].[BLOBs] (
    [FileName] nvarchar(128) NOT NULL
    , [FileExt] AS  CASE
                        WHEN CHARINDEX(N'.', [FileName]) > 0 THEN REVERSE(SUBSTRING(REVERSE([FileName]), 1, CHARINDEX('.', REVERSE([FileName])) - 1))
                        ELSE NULL
                    END PERSISTED
    , [FileBLOB] [varbinary](max) NOT NULL
    , CONSTRAINT [PK_BLOBs] PRIMARY KEY CLUSTERED ( [FileName] ASC ) ON [DEFAULT]
) ON [DEFAULT];
GO

此表已链接到MS Access 2007应用程序,作为包含此“快速不干净”编写模块的表BLOBs

Public Function saveBLOB(strFQFN As String) As Long
10      If HandleErrors() Then On Error GoTo ERR_HANDLING
20      ErrorHandler().CallStack.PushCallStack "saveBLOB('" & strFQFN & "')"

        Dim db  As DAO.Database
        Dim rs  As DAO.Recordset
        Dim fs  As Long
        Dim fn  As String
        Dim hdl As Integer
        Dim blob()  As Byte

30      fn = Right(strFQFN, Len(strFQFN) - InStrRev(strFQFN, "\"))

        ' read data from file
40      hdl = FreeFile()
50      Open strFQFN For Binary Access Read As #hdl
60      fs = LOF(hdl) - 1
70      ReDim blob(fs)
90      Get #hdl, , blob

        ' updateblob data in database
100     Set db = CurrentDb()
110     Set rs = db.OpenRecordset("BLOBs", dbOpenDynaset, dbSeeChanges)
120     rs.FindFirst ("[FileName] = '" & fn & "'")
130     If rs.NoMatch Then
140         rs.AddNew
150         rs!FileName = fn
160     Else
170         rs.Edit
180     End If

190     rs!FileBLOB = blob
200     rs.Update

210     saveBLOB = True

CLEANUP:
8000    Close #hdl
8010    On Error Resume Next
8020    rs.close
8030    Set rs = Nothing
8040    Set db = Nothing
8050    Erase blob

FINALLY:
9000    On Error GoTo 0
9010    ErrorHandler().CallStack.PopCallStack
9020    Exit Function

ERR_HANDLING:
9900    ErrorHandler().handleError ErrSinkScreen, "saveBLOB()"
9910    saveBLOB = False
9920    Resume CLEANUP
End Function

顺便说一句:ODBC驱动程序是SQL Server版本6.01.7601.17514(SQLSRV32.DLL,21.11.2010)。

只要我通过即时窗口调用该函数,一切都可以运行[[fine:

? saveBLOB("U:\example.txt") -1
blob数据已成功保存。现在有一个小子形式:

Private Sub UploadFile() 10 If HandleErrors() Then On Error GoTo ERR_HANDLING 20 ErrorHandler().CallStack.PushCallStack Me.Name & ".UploadFile()" 30 If (Not saveBLOB(Nz(Me!txtFQFN, vbNullString))) Then _ MsgBox "Beim Speichern des BLOBs in der Datenbank ist ein Fehler aufgetreten.", vbExclamation FINALLY: 9000 ErrorHandler().CallStack.PopCallStack 9010 Exit Sub ERR_HANDLING: 9900 ErrorHandler().handleError ErrSinkDatabase + ErrSinkScreen, Me.Name & ".UploadFile()" 9910 Resume FINALLY End Sub

如果从此处调用saveBLOB(),则会发生错误(

您试图将Null值分配给非Variant数据类型的变量。]​​>:Error 3162

UPDATE

:这似乎是一个大小问题。插入了一个新创建的8KB的Excel文件。导入681KB的文件失败。 Blob列为varbinary(max)。根据docs.microsoft.com:

max

表示最大存储大小为2 ^ 31-1字节。因此681KB应该完全适合。
非常感谢!

尝试将二进制文件插入varbinary列时出现一个奇怪的错误。体系结构如下:具有此表对象的SQL Server 2008数据库:CREATE TABLE [dbo]。[BLOBs]([FileName] ...

access-vba ms-access-2007
1个回答
0
投票
有最大数据量,您可以在一个语句中添加/编辑。参见Configure the max text repl size Server Configuration Option
© www.soinside.com 2019 - 2024. All rights reserved.