`
ywencn
  • 浏览: 87565 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

也来说说rails 和sqlserver 的相关问题和心得

阅读更多

 虽然大家都在说rails不适合在windows平台上用,不适合连接在sqlserver上用,但是本着无聊加上老板不关心你用什么语言的情况下,

我把 ruby on rails用在了我们自己部门的信息系统上。

 

先截个图给大家看看样子吧。

 



 正如大家所说,用rails连在sqlserver2000上一点都不好玩。

 

先说sqlserver适配器和编码问题。

首先,链接适配器就是很痛苦的事情。rails1.2以后的版本就不自带sqlserver的适配器了。

而直接能 gem install sqlserver_adapter 出来的那个适配器也有问题,不能很好的解决中文字符编码的问题。

之前看过一些文章的解决,在环境配置里面把字符集设置为UTF8,在sqlserver2000里面把字段类型配置成nvarchar。

 

但是很遗憾,我们部门的数据库有很多遗留的表格,很多是和公司级的系统对接的,不能随便更改字段类型,所以必须留着以前的varchar。

 

也有人说用rails 2.+ 的版本,把rails1.2 里面的sqlserver适配器 和 ADO拷贝过去放在相应的文件夹。

这个方法可以参见http://swifthorse.iteye.com/blog/59776

这样做的问题很快就暴露出来了,在做数据迁移的时候就会有很大的问题。

而且必须更改适配器中的一些字符类型到数据库字段类型的转换才可以使用。

我用了一段时间,但是问题不断,于是就放弃了。

 

在google找了很长时间,无意中找到一个sqlserver 2000的适配器。

很惊奇的发现这个适配器可以很好的处理中文,并且不需要在环境配置里设置成UTF8, GB2312就可以很好的工作,并且数据库的

字段类型也可以使用varchar,于是一直用了下来。

 

这个adapter 和 ado 都放在附件里了,有需要的同学可以自己下载。

 

再说EXCEL导入和导出问题。

我们部门会用到大量的EXCEL数据导入和导出的工作。

曾经尝试过一些插件,roo 也用过,效果都不理想。

 

导入的时候都报错说不能将string转换成int, 我想这大概是适配器的问题,研究了一段时间,没有成功。

曾经详细研究过夜鸣猪的这个帖子 http://hlee.iteye.com/blog/356507

各种插件也用过,也重点研究了'win23ole',大概是因为适配器的原因,都没成功。能导入导出,但是编码问题没有解决。

 

最后放弃了使用rails导入导出excel,继续使用了asp,在rails 的 view 里使用框架来引用。

不过说实在的,在windows sqlserver 上,使用asp来导入导出excel要比rails 方便很多很多。

 

又特别是导出,rails在调整导出的excel格式是非常麻烦的事情。

大家可以看一下 lmxbitihero 的这个帖子 http://lmxbitihero.iteye.com/blog/334032

 

写了那么多。

 

在ASP下面,是需要用一个网页,让其显示成需要导出的格式样子,再加一段

<%Response.AddHeader "Content-Disposition", "attachment; filename=file.xls"%>

就可以实现了。

 

所以我选择了使用asp到导入导出EXCEL,虽然看起来有点山寨,不过非常好用。

 

至于在rails中实现导出,大家可以看上面的这个截图,导出excel的按钮的地方有一个表单,用隐藏域存放了rails生成的sql语句,然后把这个sql语句提交给一个excel页面,就可以处理了。

 

所有需要生成excel的地方都指向这个ASP页面,SQL不同就导出了不同的数据。

 

FIND 和 FIND_BY_SQL

义无反顾的使用了大量的find_by_sql,肯定有人会说这样玩RAILS还有什么意思。但我也没办法,表名都叫什么 T_I2_SHIPMENT_BY_DAY 之类的,

你说我怎么去把表明和谐成符合规范的或者用映射(这一点上有待继续研究)。

另外一些查询相对一般WEB应用来说,要复杂得多,我贴一个例子吧。

 

select top 20 * from ( SELECT a.matnr AS mtm, a.kwmeng AS shipment, a.subgeo AS subgeo, 
a.itemdesc AS itemdesc, a.series, b.country, b.DISPLAY, b.Technics, b.Chipset_North_Bridge, b.Chipset_South_Bridge, 
b.Graphics, b.CPU, b.Memory1, 
b.Memory2, b.Hard_Disk_1, b.Hard_Disk_2, b.Wireless_Card, b.Optical, b.OS, b.Battery, 
b.Bluetooth FROM (SELECT matnr, subgeo, itemdesc, SUM(kwmeng) AS kwmeng,series FROM 
t_i2_shipment_by_days WHERE (matnr like '59%' or matnr like '%cto%') and shipdate>='2009-08-28' 
and shipdate<='2009-09-01' GROUP BY matnr, subgeo,series, itemdesc ) a LEFT JOIN t_por b 
ON a.matnr = b.pn union all select mtmso,sum(kwmeng) as kwmeng,subgeo,itemdesc,series,''
,lcd,'','','','',cpu,memory,'',harddisk,'',mini,'',os,'','' from t_i2_shipment_cto_days where 
shipdate>='2009-08-28' and shipdate<='2009-09-01' GROUP BY mtmso,odd,itemdesc,cpu,memory,
harddisk,mini,os,lcd,subgeo,series)c where c.mtm not in (select top 0 mtm from ( SELECT a.matnr AS mtm, 
a.kwmeng AS shipment, a.subgeo AS subgeo, a.itemdesc AS itemdesc, a.series, b.country, 
b.DISPLAY, b.Technics, b.Chipset_North_Bridge, b.Chipset_South_Bridge, 
b.Graphics, b.CPU, b.Memory1, b.Memory2, b.Hard_Disk_1, b.Hard_Disk_2, b.Wireless_Card,
 b.Optical, b.OS, b.Battery, b.Bluetooth FROM (SELECT matnr, subgeo, itemdesc, SUM(kwmeng) 
AS kwmeng,series FROM t_i2_shipment_by_days WHERE (matnr like '59%' or matnr like '%cto%') 
and shipdate>='2009-08-28' and shipdate<='2009-09-01' GROUP BY matnr, subgeo,series, itemdesc )
 a LEFT JOIN t_por b ON a.matnr = b.pn union all select mtmso,sum(kwmeng) as kwmeng,subgeo,itemdesc,series,'',l
cd,'','','','',cpu,memory,'',harddisk,'',
mini,'',os,'','' from t_i2_shipment_cto_days where shipdate>='2009-08-28' and shipdate<='2009-09-01'
 GROUP BY mtmso,odd,itemdesc,cpu,memory,
harddisk,mini,os,lcd,subgeo,series)d order by d.mtm) order by c.mtm 

  这是一个带翻页语法的最终生成的SQL语句,我实在不想把这玩意儿翻译成find方法来弄。

基于这两个原因,我部分使用了find_by_sql语句。

 

最后说分页

 

刚开始我也是用了will_paginate来分页,但是发现效果不对,不论翻到哪一些东西都是一样的。

后来上网查了一些资料,貌似说sqlserver 对 will_paginate的支持不好,木有 limit 这样的语法(未详细了解)。

 

后来在csdn上看到了一种分页的方法,于是按照那样的原理,在rails上实现了一下。

 

我的做法是,由will_paginate来生成试图上的页码和翻页提交ID,由find_by_sql来实现翻页的数据显示。

    sql_text=session[:sql]
    limit=20
    offset=limit*(params[:id]|| 1).to_i-limit
    sql_pass="select top #{limit} * from (#{sql_text})c  where c.mtm not in (select top #{offset} mtm from (#{sql_text})d order by d.mtm) order by c.mtm"
    shipment=Shipment.find_by_sql(sql_pass)
    shipment2=Shipment.paginate_by_sql(sql_text,:page =>params[:id] , :per_page =>"20")
    @shipment=shipment
    @shipment2=shipment2

 @shipment 在试图上用来显示数据(我承认这个名字叫@shipments更合适)

@shipment2用于在视图上显示页码,生成页码链接。

这样就可以很好的工作了,或许有人会说这样就执行了两次查询,不过没事,我们部门人不多,服务器尚且算好,这点小东西没什么影响。

 

目前这个系统也还在继续开发中,其中的心得体会也希望能够和大家继续交流。

 

此外我自己下班后也在做一些小型的WEB项目,就是玩玩,顺便学学CSS 和 RAILS,其中就不使用这边这么山寨的方法了。

有机会也希望能够更多的和大家交流。恩。

 

写完了~累死了~

 

  • 大小: 120.7 KB
分享到:
评论
4 楼 ywencn 2009-09-02  
mccxj 写道


我们在linux+oracle+rails外接一个sqlserver,用dbi来操作的,
用的unixODBC+freeTDS+ruby-odbc+dbi搞定了。不可否认,有时候是迫不得已的

除了sqlserver_adapter,还有odbc-rails这样的方案,不过由于交互不多,还是选择dbi方便快捷

关于excel导入,可以选择使用spreadsheet,roo也是用着它,只要弄弄
require 'spreadsheet'
Spreadsheet.client_encoding = 'GBK//IGNORE'
暂时还算运行ok
至于导出,我们一般选择xml的excel格式,配置一下headers,选择xx.xls.erb来渲染即可。基本还是能出来的。


学习中~~~
3 楼 ywencn 2009-09-02  
poshboytl 写道
1.Rails的确不太适合跑在windows上.
2.Rails的确不太适合试用Sql server
3.Rails的确不太适合处理遗留系统(非rails遗留系统)

三样都占齐了, 楼主还是坚决选择Rails. 佩服佩服....
感谢楼主的经验分享....  要不再谈谈部署?



此人不怀好意,没劲。

什么是不适合,搞不出来就是不适合,得到想要的结果就是适合。
所谓的不适合的那些原因,什么编码之类的,我到目前为止都还解决得不错。

正如mccxj所说,有些时候是迫不得已。

面对着一个轻量级的部门系统,你要我用它原来的ASP继续写下去?

与其无聊到死,还不如弄点新花样学点东西,有什么不好,老板也可以继续得到他要的东西。

你不喜欢rails连在sqlserver上就别看这个帖子,但总有人需要这样做。
2 楼 mccxj 2009-09-02  
poshboytl 写道
1.Rails的确不太适合跑在windows上.
2.Rails的确不太适合试用Sql server
3.Rails的确不太适合处理遗留系统(非rails遗留系统)

三样都占齐了, 楼主还是坚决选择Rails. 佩服佩服....
感谢楼主的经验分享....  要不再谈谈部署?


我们在linux+oracle+rails外接一个sqlserver,用dbi来操作的,
用的unixODBC+freeTDS+ruby-odbc+dbi搞定了。不可否认,有时候是迫不得已的

除了sqlserver_adapter,还有odbc-rails这样的方案,不过由于交互不多,还是选择dbi方便快捷

关于excel导入,可以选择使用spreadsheet,roo也是用着它,只要弄弄
require 'spreadsheet'
Spreadsheet.client_encoding = 'GBK//IGNORE'
暂时还算运行ok
至于导出,我们一般选择xml的excel格式,配置一下headers,选择xx.xls.erb来渲染即可。基本还是能出来的。
1 楼 poshboytl 2009-09-02  
1.Rails的确不太适合跑在windows上.
2.Rails的确不太适合试用Sql server
3.Rails的确不太适合处理遗留系统(非rails遗留系统)

三样都占齐了, 楼主还是坚决选择Rails. 佩服佩服....
感谢楼主的经验分享....  要不再谈谈部署?

相关推荐

    rails配置sqlserver2000

    在Ruby on Rails框架中,与SQLServer 2000集成可能会比与其他常见的数据库系统(如MySQL或PostgreSQL)稍复杂一些,因为SQLServer 2000的兼容性问题和缺少官方支持。然而,通过一些第三方库和适当的配置,我们仍然...

    Ruby-SQLServerRailsActiveRecord的SQLServer适配器

    总的来说,`activerecord-sqlserver-adapter`是Rails开发者在与SQL Server交互时的重要工具,它提供了必要的桥梁,使得Rails应用可以充分利用SQL Server的强大功能,同时保持代码的简洁性和可维护性。通过理解和熟练...

    网上书城struts+jsp+SqlServer源代码

    Struts、JSP和SQL Server是构建Web应用程序的常用技术栈,它们在“网上书城”项目中的结合展示了如何利用这些技术实现一个完整的电子商务平台。本文将深入探讨这些技术及其在实际项目中的应用。 首先,Struts是一个...

    Rails相关电子书汇总

    标题 "Rails相关电子书汇总" 暗示了这个压缩包包含了关于Ruby on Rails框架的电子书籍资源。Ruby on Rails,通常简称为Rails,是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,以...

    rails2.3.2

    4. 插件和Gem:Rails 2.3.x 支持 Gem 管理系统,允许开发者通过安装和管理第三方 Gem 来扩展 Rails 功能。插件是 Rails 社区共享代码的一种方式,可以快速添加特定功能。 5. 测试框架:Rails 内置了测试支持,包括 ...

    rails和mysql数据库连接中出现的问题以及解决办法

    总结来说,解决Rails与MySQL连接问题涉及检查配置文件、安装和更新依赖、确保系统库完整、确认服务状态和网络连接以及处理版本兼容性。通过排查这些方面,大部分问题都能迎刃而解。在遇到问题时,查看错误日志、查阅...

    Rails

    综合以上信息,学习和掌握Rails需要理解其核心组件和设计理念,熟练使用相关工具,阅读源码以加深对框架运作的理解,并通过实践项目来巩固理论知识。Rails是一个强大且高效的Web开发框架,它简化了许多常见的开发...

    Rails SQL查询跟踪器-Ruby开发

    Rails SQL查询跟踪器sql_tracker通过订阅Rails的sql.active_record事件通知来跟踪SQL查询。 然后,它汇总并生成报告,以使您对Ra Rails SQL查询跟踪器中发生的所有SQL查询有更深入的了解,sql_tracker通过订阅Rails...

    rails web server deploy guide

    标题 "rails web server deploy guide" 暗示了这是一个关于如何部署Rails Web服务器的指南。...阅读和理解"rails web server deploy guide"这样的资源,对于任何希望将Rails应用推向生产的开发者来说都是必不可少的。

    Rails的中文乱码问题

    在提供的“ruby-refm.chm”文件中,可能包含了Ruby语言和相关工具的参考手册,这将有助于理解Ruby的基础语法和Rails框架的使用,包括如何处理字符串和编码问题。查阅此手册,可以找到关于字符串操作、编码转换等相关...

    activerecord-sqlserver-adapter:用于RailsSQL Server适配器

    迁移中的所有简化的Rails类型都将与匹配SQL Server国家(unicode)数据类型相对应。 始终检查initialize_native_database_types 以获取更新的列表。 以下类型( date , datetime2 , datetimeoffset ,

    Rails项目源代码

    这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何利用Rails的强大功能来创建一个允许用户上传、分享和浏览图片的应用。 1. **Rails框架基础**: Rails的核心理念是DRY(Don't...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    通过以上介绍,我们不仅了解了Rails的基础知识,还深入探讨了其核心组件——Active Record的相关概念和技术细节。这些内容对于初学者来说是非常宝贵的入门资料,同时也是进一步学习和实践的基石。随着对Rails的深入...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    Rails101_by_rails4.0

    《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...

    Advanced Rails

    5. **Rails安全**:学习如何防止常见的Web攻击,如SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)。了解授权库如Pundit和CanCanCan,以及如何安全地处理用户输入和密码存储。 6. **部署与维护**:了解如何在各种...

    activerecord-sqlserver-adapter-mirroring:Rails 的数据库镜像支持 activerecord-sqlserver-adapter

    目标 Rails 4.1.x 和 activerecord-sqlserver-adapter 4.1.0。 用法 添加到 Gemfile: gem 'tiny_tds' gem 'activerecord-sqlserver-adapter-mirroring' 将镜像部分添加到 database.yml: development: ...

Global site tag (gtag.js) - Google Analytics