SQL Server Native Client / ODBC Driver for SQL Server & DAO 无法将 blob > 8k 插入 varbinary(MAX) 字段



请考虑下表:

USE [MyTestDb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MyTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FileBlob] [varbinary](max) NULL,
 CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

在这里,我想将PDF文件作为二进制blob插入:

Function FileToBlob(FilePath As String) As Byte()    
    Dim File As Integer
    Dim FileBlob() As Byte
    File = FreeFile(0)
    Open FilePath For Binary Access Read As #File
    ReDim FileBlob(LOF(File) - 1)
    Get #File, , FileBlob
    Close #File
    FileToBlob = FileBlob
End Function
Private Sub Command1_Click()    
    On Error GoTo ErrHdl
    Dim db As DAO.Database
    Set db = DBEngine(0).OpenDatabase("", False, False, "ODBC;Driver={ODBC Driver 13 for SQL Server};Server=(local);Database=MyTestDb;Trusted_Connection=yes;DataTypeCompatibility=80")
    Dim rec As DAO.Recordset
    Set rec = db.OpenRecordset("MyTable", dbOpenDynaset, dbSeeChanges)
    rec.AddNew 
    rec![FileBlob] = FileToBlob("D:TestFile.pdf")
    rec.Update
    rec.Close    
    db.Close
    Exit Sub
ErrHdl:    
    Dim i As Long
    For i = 0 To Errors.Count - 1
        Debug.Print Errors(i).Number, Errors(i).Description
    Next i
End Sub

rec.Update运行时,错误处理程序会打印以下输出:

0 [Microsoft][ODBC 驱动程序 13 for SQL Server]字符串数据,右侧 截断

3146 ODBC - 呼叫失败。

我观察到以下更改会导致 blob 成功插入:

  • 使用大小为 <= 8k 的文件
  • 切换到旧版"SQL 驱动程序",如下所示:"ODBC;Driver={SQL Server};..."
  • 将 Blob 列的数据类型从 varbinary(MAX) 更改为(已弃用(image
  • 切换到 ADO 连接和记录集

但是,这些对我来说都不代表真正的解决方案。有没有办法使用原始插入命令成功?

您需要

设置DataTypeCompatibility=0 。 80 表示您仅限于 Sql Server 2005 数据类型,其中不包括MAX类型。

https://learn.microsoft.com/en-us/sql/relational-databases/native-client/system-requirements-for-sql-server-native-client

OLE DB 和 ADO 应用程序可以将 DataTypeCompatibility 连接字符串关键字与 SQL Server 本机客户端一起使用,以使用较旧的数据类型进行操作。当数据类型兼容性 = 80 时,OLE DB 客户端将使用 SQL Server 2005 表格数据流 (TDS( 版本而不是 TDS 版本进行连接。这意味着对于 SQL Server 2008 及更高版本的数据类型,下层转换将由服务器执行,而不是由 SQL Server 本机客户端执行。这也意味着连接上可用的功能将仅限于 SQL Server 2005 功能集。

最新更新