【问题标题】:Add SQL 2014 support to activerecord-sqlserver-adapter将 SQL 2014 支持添加到 activerecord-sqlserver-adapter
【发布时间】:2014-10-07 17:44:13
【问题描述】:

我们在 sqlserver 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 上的修复程序。但是,当我尝试部署时,我现在收到一个 UnitializedConstant 错误,指的是 AbstractAdapter。

如何使这个补丁起作用?还是有更好的方法来完成这项任务?

【问题讨论】:

    标签: sql-server ruby-on-rails-3 gem monkeypatching


    【解决方案1】:

    我找到了一个比猴子补丁更好的解决方案。原来在 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" 
    

    【讨论】:

      【解决方案2】:

      我对 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
      

      【讨论】:

      • @donfnielson,上面的模块是在哪里创建的,可以给我路径和文件名吗?
      【解决方案3】:

      我还用我继承的 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 上的旧 Ruby 程序的过时 2008R2 服务器集改造为新的 Windows Server 2016 设置,并且没有调试旧 Ruby 代码以使其与更新版本的 Ruby 和Ruby on Rails。

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

      【讨论】:

        猜你喜欢
        • 2012-07-13
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多