Sql server 使用SQL Server后端在Access数据库中保存大文件(超过20 MB)失败

Sql server 使用SQL Server后端在Access数据库中保存大文件(超过20 MB)失败,sql-server,object,ms-access,vba,ole,Sql Server,Object,Ms Access,Vba,Ole,我有一个带有Microsoft Access前端和SQL Server后端的应用程序。该链接是使用SQL Server本机客户端11.0通过ODBC数据源实现的 有一个表的列附件为OLE对象数据类型。后端是一个表,附件列的数据类型为VARBINARY(MAX)。 我使用绑定对象框将文件保存在“附件”字段中。在文件大小超过20MB之前,一切正常。语句BoundOLEFrame.Action=acOLECreateEmbed大约需要2.5分钟才能完成。它不会引发任何异常,但当执行以下MoveNext

我有一个带有Microsoft Access前端和SQL Server后端的应用程序。该链接是使用SQL Server本机客户端11.0通过ODBC数据源实现的

有一个表的列附件为OLE对象数据类型。后端是一个表,附件列的数据类型为VARBINARY(MAX)。 我使用绑定对象框将文件保存在“附件”字段中。在文件大小超过20MB之前,一切正常。语句BoundOLEFrame.Action=acOLECreateEmbed大约需要2.5分钟才能完成。它不会引发任何异常,但当执行以下MoveNext或任何记录集重新定位语句时,它们会失败,并出现运行时错误“3426”:

“该操作已被关联对象取消。”

因此,文件似乎没有存储在数据库中。试图通过双击字段打开具有Access UI的文件会导致错误:

“Microsoft Access与服务器通信时出现问题 OLE服务器或ActiveX控件。关闭OLE服务器并重新启动 在Microsoft Access之外。然后在中重试原始操作 Microsoft Access。“

我怀疑这个问题可能与ODBC超时有关,ODBC超时默认设置为60秒,因此我尝试将当前数据库QueryTimeout设置为600秒。但这并没有帮助

直接在表中插入这些大文件(在Access table Data Sheet视图中,右键单击字段并在弹出菜单中选择Insert Object…)首先显示为成功,因为文件看起来像是插入的,可以通过双击字段打开。但是,当我试图关闭表时,系统会提示我是否要保存它。回答肯定会导致以下错误:

“此时无法保存此记录。Microsoft Access可能已 尝试保存记录时遇到错误。如果关闭此 对象,您所做的数据更改将丢失。是否继续 是否仍要关闭数据库对象?”

据我所知,OLE对象字段的大小为1GB,远远高于我的文件大小

如有任何建议,将不胜感激。我正在寻找解决这个特殊问题的方法。我不认为文件存储的替代设计与这个主题相关


我没有以任何其他方式存储文件的选项。

好吧,OLE对象字段的最大大小可能是1G,但Access的总体文件大小是2G

因此,如果你有超过100 x 20M的字段,那么就会出现问题

目前尚不清楚到底有多少记录正在传输到前端文件。我会测试一组非常有限的记录,看看是字段大小还是整体文件大小起作用。。。。也许这会给我们一些启示


我可以从你的帖子中看出,你不希望我建议将这些附件放在他们自己的文件夹中,只存储链接-但是嘿-这是更好的设计…

如果我是你,我会共享所有相关的代码,因为这是非常非正统的代码。我会尽量在同一时间重新开始嗯。。。实际上,我根本无法保存这么大的OLE对象,即使通过GUI直接将它们插入到未链接的表中。我收到一个错误消息,您此时无法保存此记录。是。我也一样。但是,这不是SQL Server的问题,因为我可以将相同的文件保存为字节流(非常相似的大小),但是我不能通过双击字段来打开它们。为此,我需要它们是OLE对象。不,这都是访问权限。我在Access 2010和2016下做了一个快速测试,都使用本地存储,并且都无法保存超过20 MB的OLE包。但是,如果将OLE blob(长二进制数据)直接链接到SQL server,则其最大可达1 GB,甚至更大。如何将其另存为OLE blob?我可以通过双击打开它吗?Cahaba Data,我希望您已经注意到数据实际上存储在SQL Server中。我不知道这是否会导致Access 2016 32位数据库大小限制出现问题。我已经实施了另一种解决方案,其中保存的文件大小不超过20 MB。但是,作为前端平台,Access仍然存在一些重大问题。程序冻结了。没有错误或例外。只是停止回应。调试汇编代码表明,访问是在一个无休止的循环中进行的。非常令人沮丧。我的担忧/建议是,PC应用程序(Access)可能是大型机大小后端的前端。人们必须考虑最薄弱的环节——或者更好的类比是连接花园软管的消防水管。SQL Server绝对可以保存数据,但如果有太多数据传输到Access,那么这就是问题所在。Access是一种前端数据库技术,因此所有的逻辑处理都在那里完成。我不知道您关于涉及多少记录的查询结构——每个记录都有2000万个附件——但我的直觉是这是一个数据量问题。