繁体   English   中英

将SQL 2014支持添加到activerecord-sqlserver-adapter

[英]Add SQL 2014 support to activerecord-sqlserver-adapter

我们正在使用srecserver 2008的activerecord-sqlserver-adapter gem,一切都很好。 我们只是尝试针对新的sqlserver 2014 db部署我们的Rails 3应用程序,我收到一条错误消息:

Currently, only 2005, 2008, 2010, 2011, and 2012 are supported. We got back Microsoft SQL Server 2014 - 12.0.2000.8 (X64)

快速浏览github会发现最近对sqlserver_adapter.rd进行了一次小更新以解决此问题。 我试图更新gem并且它变成了一点依赖地狱,最终看起来好像我必须升级到rails 4(我现在不特别想做)以获得此修复。

所以我想我第一次尝试使用猴子补丁并在我的初始化文件夹中创建了一个.rd,其中包含了添加sqlserver 2014支持的更改:

module ConnectionAdapters  

    class SqlServerAdapter < AbstractAdapter
      SUPPORTED_VERSIONS = [2005,2008,2010,2011,2012,2014]


      # === SQLServer Specific (DB Reflection) ======================== #

       def sqlserver_2014?
        @database_year == 2014
      end



    end
   end

我的目的是简单地覆盖sqlserver_adapter.rd中的几行代码,并修改github上的修复。 但是当我尝试部署时,我现在得到一个引用AbstractAdapter的UnitializedConstant错误。

如何使这个补丁工作? 或者这有更好的方法来完成这项任务?

我找到了比猴子补丁更好的解决方案。 原来在activerecord-sqlserver-adapter上的人更新了各种版本所以我只需要指定版本3.2分支与SQLServer 2014支持修复。 我的gem文件中的以下行解决了整个问题,我们现在连接到SqlServer '14

gem 'activerecord-sqlserver-adapter', :git => "git://github.com/rails-sqlserver/activerecord-sqlserver-adapter.git", :branch => "3-2-stable" 

我用v 4.1.8做了以下内容:

module ActiveRecord
  module ConnectionAdapters
    class SQLServerAdapter < AbstractAdapter
      SUPPORTED_VERSIONS << 2014
      # === SQLServer Specific (DB Reflection) ======================== #

      def sqlserver_2014?
        @database_year = 2014
      end
    end
  end
end

我还用我继承的Ruby 1.8.6设置解决了这个问题。

解决方案并不像这里提出的那样高科技。

适配器接口位于C:\\ruby\\lib\\ruby\\gems\\1.8\\gems\\activerecord-sqlserver-adapter-2.3.4\\lib\\active_record\\connection_adapters ,名为sqlserver_adapter.rb

我修改了以下代码,如下所示:

    class SQLServerAdapter < AbstractAdapter

  ADAPTER_NAME                = 'SQLServer'.freeze
  VERSION                     = '2.3.4'.freeze
  DATABASE_VERSION_REGEXP     = /Microsoft SQL Server\s+(\d{4})/
  SUPPORTED_VERSIONS          = [2000,2005,2008,2012,2016].freeze
  LIMITABLE_TYPES             = ['string','integer','float','char','nchar','varchar','nvarchar'].freeze
  LOST_CONNECTION_EXCEPTIONS  = {
    :odbc => ['ODBC::Error'],
    :ado  => []
  }
  LOST_CONNECTION_MESSAGES    = {
    :odbc => [/link failure/, /server failed/, /connection was already closed/, /invalid handle/i],
    :ado  => []
  }

我修改适配器代码的唯一方法是将[2000,2005,2008]更改为[2000,2005,2008,2012,2016]

然后,我使用ODBC数据源管理器(32位)配置为Sql Server 2016实例使用“SQL Server Native Client 11.0”。

最后一步是ODBC适配器设置中非常重要的一步。

“SQL Server”适配器可能默认为64位连接,在尝试连接到数据库时会出现以下错误:

#<ODBC::Error: S1090 (0) [Microsoft][ODBC Driver Manager] Invalid string or buffer length>.

我正在将在Apache上运行的过时的2008R2服务器遗留Ruby程序集改造成新的Windows Server 2016设置,并且没有调试遗留Ruby代码以使其与更新版本的Ruby和Ruby on Rails一起工作的奢侈。

这种低技术解决方案完全满足我们的运营需求,预算和时间限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM