`
phoenix520
  • 浏览: 142282 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Rails2.3+ 使用SQL2005

阅读更多

  一个小型项目,历史数据库是SQL2005,不能更改数据库,所以折腾了一下午,到处查资料,终于成功的让Ruby1.8.7+Rails2.3.4在SQL2005上跑起来了。

  安装sqlserver的驱动:gem install activerecord-sqlserver-adapter

 

  安装dbi (0.4.1)后,直接使用ADO来访问SQL Server,提示无法打开ADO驱动,原来是缺少了ADO.rb这个文件,下载DBI的老版本(0.2.*),将lib/dbd_ado/ADO.rb文件拷贝到X:/ruby/lib/ruby/site_ruby/1.8/DBD/ADO/ADO.rb,再次连接数据库仍然提示无法连接,修改database.yml:

development:
  adapter: sqlserver
  database: database
  username: user
  password: pwd
  host: .\SQLEXPRESS
  mode: DBI:ADO
  provider: SQLNCLI

  注意host那里,不能填localhost,也不能填127.0.0.1,否则无法连接到数据库,不知道为什么。

 

  现在可以正常连接到数据库了,但是查询出来的结果仍然为乱码,在database.yml中设置encoding无效,解决方法为:在environment.rb添加下面代码
require 'win32ole'
WIN32OLE.codepage = WIN32OLE::CP_UTF8

然后一切正常,不知道以后还会不会遇到啥莫名其妙的问题。

 

PS:Ruby中ADO连接SQLServer的方式已经不再推荐使用,ADO.rb已经年久失修了,貌似有很多问题。

 

使用ODBC的方式链接SQLServer:

当然第一步要配好ODBC数据源,然后再修改database.yml:

development:
  adapter: sqlserver
  mode: ODBC  
  username: urname
  password: ***
  dsn: urdsn

 这时候Rails已经可以成功连接到SQLServer了,但是不能查询数据,查询时会报错:

wrong number of arguments (2 for 1)

需要修改 ruby\lib\ruby\1.8\delegate.rb 这个文件,

第166行和273行定义的方法需要修改为:

def respond_to?(m, include_private = false)  # :nodoc:
    return true if super
    return @_dc_obj.respond_to?(m, include_private)
end

 然后连接数据库查询不会再报错,不过查询出来的中文是GBK编码的,如果放在页面上显示,需要手动转换,比较麻烦。查看ruby\lib\ruby\gems\1.8\gems\activerecord-sqlserver-adapter-2.2.22\lib\active_record\connection_adapters\sqlserver_adapter.rb这个文件,第53行:

value.force_encoding('UTF-8') rescue value

 由于force_encoding是Ruby1.9里面新增的方法,所以在1.8下面这行代码始终返回value,而没有进行编码转换,既然知道了查询出来的结果是GBK编码的,那暂时用Iconv强制转换一下好了:

value.force_encoding('UTF-8') rescue Iconv.conv('UTF-8','GBK',value) rescue value

 至此查询显示乱码问题搞定,在对数据库进行修改操作和根据用户输入进行查询时,还得手工进行转换,再过几年Ruby社区迁移到1.9平台上后这个问题应该就会消失掉了。

 

在使用过程中发现activerecord-sqlserver-adapter (2.2.22)的分页有问题,真是多灾多难啊,继续修改上面的那个sqlserver_adapter.rb文件,第467行那一大段修改为:

if options[:limit] and options[:offset]
   sql.sub!(/ORDER BY.*$/i, '')
   sql.sub!(/SELECT/i,
                   "SELECT row_number() over( order by #{options[:order]} ) as row_num, \n")
   sql.replace("select top #{options[:limit]} * from (#{sql}) as tmp_table1 \n" +
                  "where row_num > #{options[:offset]}")
end   
 

这种修改只对于SQLServer2005以上版本有效,由于使用了order by,在查询中如果没有指定:order就会报错,继续修改will_paginate的finder.rb,在第80行args << find_options前面加上find_options[:order] ||= primary_key:

WillPaginate::Collection.create(page, per_page, total_entries) do |pager|
     count_options = options.except :page, :per_page, :total_entries, :finder
     find_options = count_options.except(:count).update(:offset => pager.offset, :limit => pager.per_page) 
     find_options[:order] ||= primary_key
     args << find_options
     # @options_from_last_find = nil
     pager.replace(send(finder, *args) { |*a| yield(*a) if block_given? })
          
    # magic counting for user convenience:
    pager.total_entries = wp_count(count_options, args, finder) unless pager.total_entries
end

 至此分页问题解决。sqlserver-adapter的作者目前正致力与解决该驱动和Rails3.0的兼容性,承诺以后会对分页语句进行修改,不知道在哪个版本里面可以解决。

分享到:
评论

相关推荐

    ruby on rails 2.3.5 api html版

    它允许开发者使用Ruby代码操作数据库,无需编写SQL语句。 4. **路由(Routing)**:Rails的路由系统将URL请求映射到控制器的行动上,定义了Web应用的导航结构。 5. **Helper方法**:这些辅助方法在视图层提供便利...

    rails 3.2 API

    4. **ActiveRecord**:这是Rails的ORM(对象关系映射)层,它允许开发者使用Ruby来操作数据库,而无需编写SQL。Rails 3.2的ActiveRecord引入了更好的查询接口,如`#pluck`和`#exists?`,以及更强大的事务处理能力。 ...

    rails2.3.2

    描述中的 "ruby and rails 的框架rails-2.3.3.zip" 提到的是 Rails 的另一个版本 2.3.3,尽管与标题中的版本号不完全匹配,但我们可以推断这是关于 Rails 2.3.x 系列的讨论。这个压缩包很可能包含了 Rails 框架的源...

    rails_db:Rails数据库查看器和SQL查询运行器

    版本&gt;2.0 100%适用于Ruby 2.3 +,Rails 5和Rails 6(2.3.1要求&gt; = Rails 6,Rails 5使用2.2.1)。 至于其他版本的RoR,请使用1.6版的gem。 Travis CI上还运行着自动化测试。 支持:PostgreSQL,MySQL,SQLite。 不...

    pp_sql:Rails ActiveRecord SQL查询日志美化器

    您可以将此版本的~&gt; 0.2与Ruby 2.2、2.3和/或Rails 4.0、4.1一起使用 用法 Post.first.to_sql 为了方便,干净地使用自定义字符串,您可以使用内置优化功能: using PpSql::ToSqlBeautifyRefinement 或者如果您需要...

    Rails.Angular.Postgres.and.Bootstrap.2nd.Edition

    This book covers Postgres 9.5, Rails 5, and Ruby 2.3. You should have some experience with basic Rails concepts and a cursory understanding of JavaScript, CSS, and SQL, but by no means need to be an ...

    Ruby on Rails Web开发之旅.pdf【第二部分】

     2.3 在Mac OS X系统上安装Ruby on Rails  2.3.1 Mac OS X 10.5(Leopard)  2.3.2 Mac OS X 10.4(Tiger)和更早的版本  2.4 在Linux系统上安装Ruby on Rails  2.4.1 使用包管理器  2.4.2 先决条件 ...

    Ruby on Rails Web开发之旅.pdf【第一部分】

     2.3 在Mac OS X系统上安装Ruby on Rails  2.3.1 Mac OS X 10.5(Leopard)  2.3.2 Mac OS X 10.4(Tiger)和更早的版本  2.4 在Linux系统上安装Ruby on Rails  2.4.1 使用包管理器  2.4.2 先决条件 ...

    Ruby on Rails Web开发之旅.pdf【第三部分】

     2.3 在Mac OS X系统上安装Ruby on Rails  2.3.1 Mac OS X 10.5(Leopard)  2.3.2 Mac OS X 10.4(Tiger)和更早的版本  2.4 在Linux系统上安装Ruby on Rails  2.4.1 使用包管理器  2.4.2 先决条件 ...

    Agile Web Development with Rails中文版 3rd Edition

    本书《敏捷Web开发之Rails应用详解》第三版主要介绍了如何使用Ruby on Rails框架来进行敏捷Web开发。Rails是一个用Ruby语言编写的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,并且强调代码的简洁...

    activesupport_notifications_backport

    使用这个库,Rails 2.3开发者可以利用`ActiveSupport::Notifications`来收集应用的运行时信息,帮助优化性能、调试问题,并且更好地理解代码的运行情况。总的来说,`activesupport_notifications_backport`是向旧...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    2.3 Action Pack:视图与控制器 13 第3章 安装Rails 15 3.1 购物清单 15 3.2 Windows上的安装 15 3.3 Mac OS X上的安装 17 3.4 Linux上的安装 17 3.5 选择Rails版本 18 3.6 开发环境 19 3.7 Rails和数据库 22 3.8 ...

    CentOS6.2安装redmine2.3文档

    ### CentOS6.2安装Redmine2.3详细步骤解析 #### 一、环境准备与依赖安装 在开始安装Redmine之前,确保您的CentOS 6.2系统已经更新到最新状态,并安装了必要的依赖包。 **第1步:安装支持插件和其他插件** 执行...

    nosql 入门教程

    2.3 小结 34 第3章 NoSQL接口与交互 36 3.1 没了SQL还剩什么 36 3.1.1 存储和访问数据 37 3.1.2 MongoDB数据存储与访问 37 3.1.3 MongoDB数据查询 41 3.1.4 Redis数据存储与访问 43 3.1.5 Redis数据查询 47 ...

    db2数据库入门教程(官方中文版)

    1.9.3 Starter Toolkit for DB2 on Rails.............................................................................17 1.9.4 Web 2.0 Starter Toolkit for DB2 ..............................................

    training_curriculum

    4.2 Active Record:深入学习数据库操作,包括ActiveRecord的使用,模型关系(association)和查询语言(SQL)。 4.3 Views与模板:学习ERB模板语言,掌握视图的创建与渲染,以及局部变量和助手方法的使用。 4.4 ...

    软件工程导读

    - **SQL Server**:覆盖SQL Server的基础知识和高级特性,适合不同水平的学习者。 - **Oracle**:提供Oracle数据库的管理与开发学习资料。 #### 2.4 Web开发技术 - **HTML/xHTML** 和 **CSS**:介绍网页布局和样式...

Global site tag (gtag.js) - Google Analytics