1

我们正在努力将我们的应用程序升级到最新版本的 Ruby & Rails。我们的应用程序与旧数据库 (SQL Server 2008 R2) 集成,该数据库具有包含图像数据类型列的表(我们无法将此列更改为 varbinary(max))。以前我们能够将二进制文件保存到图像列中。但是现在我们遇到了转换错误。

我们正在努力升级到以下(除其他外):

  • 导轨 4.2.1
  • ActiveRecord_SQLServer_Adapter (4.2.4)
  • tiny_tds (0.6.3.rc1)
  • freeTDS (v0.91.112)

当我们现在尝试保存到图像列时,我们会收到类似于以下内容的错误:

TinyTds::Error: 字符串后的未闭合引号

在研究 tiny_tds 和 activerecord_sqlserver_adapter 中的各种问题后,我们决定创建第二个与第一个匹配的表,但将数据类型从 image 更改为 varbinary(max)。我们可以将二进制文件保存到列中。

导致挑战的代码在后台作业中,我们从 s3 抓取图像,将它们存储在本地,然后将图像推送到数据库中。同样,我们不控制遗留数据库,因此无法更改数据类型(或者面临为什么我们首先将图像存储在数据库中的问题)。

...
@d = Doc.new
...
open("#{Rails.root}/cache/pictures/image.png", "wb") do |file|
    file << open(r.image.url).read
end

@d.document = File.binread("#{Rails.root}/cache/pictures/image.png")
@d.save!

鉴于升级破坏了我们保存的图像,我们正试图找出如何最好地确定修复。我们显然可以回滚,直到我们找到一个有效的版本。不过我们希望能找到解决办法。有人有想法么?

更新:我们添加了以下配置,因为我们在要插入的表上有触发器:ActiveRecord::ConnectionAdapters::SQLServerAdapter.use_output_inserted = true

当我们删除此配置时,我们会收到以下错误: TinyTds::Error: The target table 'doc' of the DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause.

注意:我们无法对触发器进行任何修改。

4

1 回答 1

0

根据ActiveRecord_SQLServer_Adapter站点上的反馈,我们回滚到 4.1.11,现在可以保存到图像列中。

我们还必须添加这个片段来克服触发器的问题。

于 2015-06-19T20:33:31.550 回答