Rails 4 ActiveRecord Sql Server - 无法将二进制保存到图像列

时间:2015-06-13 02:01:30

标签: ruby-on-rails-4 rails-activerecord freetds tiny-tds

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

我们正努力升级到以下(其中包括):

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

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

TinyTds ::错误:字符串

后的未闭合引号

研究tiny_tds和amp;中的各种问题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.

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

1 个答案:

答案 0 :(得分:0)

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

我们还必须添加此snippet来克服触发器的问题。