简体   繁体   English

使用ActiveRecord连接到SQL Server

[英]Connecting to SQL Server with ActiveRecord

Have you ever had to connect to SQL Server with ActiveRecord? 您是否曾经使用ActiveRecord连接到SQL Server? Is this possible? 这可能吗? Can anyone provide some starting points? 任何人都可以提供一些起点吗?

This what I used: 这是我用过的:

From here: http://github.com/rails-sqlserver/2000-2005-adapter/tree/master 从这里: http//github.com/rails-sqlserver/2000-2005-adapter/tree/master

Installation 安装

First, you will need Ruby DBI and Ruby ODBC. 首先,您需要Ruby DBI和Ruby ODBC。 To my knowledge the ADO DBD for DBI is no longer supported. 据我所知,不再支持ADO DBD for DBI。 The installation below is not a comprehensive walk thru on how to get all the required moving parts like FreeTDS installed and/or configured. 下面的安装不是全面了解如何安装和/或配置FreeTDS等所有必需的移动部件。 It will also assume gem installations of both the dependent libraries and the adapter itself. 它还将假定依赖库和适配器本身的gem安装。

It should be noted that this version of the adapter was developed using both the ancient 0.0.23 version of DBI up to the current stable release of 0.4.0. 应该注意的是,这个版本的适配器是使用古老的0.0.23版本的DBI开发的,直到0.4.0的当前稳定版本。 Because later versions of DBI will be changing many things, IT IS HIGHLY RECOMMENDED that you max your install to version 0.4.0 which the examples below show. 因为更高版本的DBI将会改变很多东西,所以我们强烈建议您将安装最大化到版本0.4.0,以下示例显示。 For the time being we are not supporting DBI versions higher than 0.4.0. 目前我们不支持高于0.4.0的DBI版本。 The good news is that if you were using a very old DBI with ADO, technically this adapter will still work for you, but be warned your path is getting old and may not be supported for long. 好消息是,如果你使用一个非常旧的DBI与ADO,从技术上讲,这个适配器仍然可以为你工作,但要警告你的路径变老,可能不会长期支持。

$ gem install dbi --version 0.4.0
$ gem install dbd-odbc --version 0.2.4
$ gem install rails-sqlserver-2000-2005-adapter -s http://gems.github.com

From here: http://lambie.org/2008/02/28/connecting-to-an-mssql-database-from-ruby-on-ubuntu/ 从这里: http//lambie.org/2008/02/28/connecting-to-an-mssql-database-from-ruby-on-ubuntu/

Firstly, update your ~/.profile to include the following: 首先,更新〜/ .profile以包含以下内容:

export ODBCINI=/etc/odbc.ini
export ODBCSYSINI=/etc
export FREETDSCONF=/etc/freetds/freetds.conf

Then reload your .profile, by logging out and in again. 然后重新加载.profile,再次注销。

Secondly, on Ubuntu 7.10 Server I needed to install some packages. 其次,在Ubuntu 7.10服务器上我需要安装一些软件包。

mlambie@ubuntu:~$ sudo aptitude install unixodbc unixodbc-dev freetds-dev sqsh tdsodbc 

With FreeTDS installed I could configure it like this: 安装FreeTDS后,我可以这样配置:

mlambie@ubuntu:/etc/freetds$ cat freetds.conf
[ACUMENSERVER]
  host = 192.168.0.10
  port = 1433
  tds version = 7.0

The important thing here is ACUMENSERVER, which is the DSN that I'll use when connecting to the database. 这里重要的是ACUMENSERVER,它是我在连接数据库时使用的DSN。 The host, and port are self-explanatory, and it's worth noting that I had to use 7.0 specifically as the tds version. 主机和端口是不言自明的,值得注意的是我必须特别使用7.0作为tds版本。

Testing FreeTDS is not too hard: 测试FreeTDS并不太难:

mlambie@ubuntu:~$ sqsh -S ACUMENSERVER -U username -P password
sqsh: Symbol `_XmStrings' has different size in shared object, consider re-linking
sqsh-2.1 Copyright (C) 1995-2001 Scott C. Gray
This is free software with ABSOLUTELY NO WARRANTY
For more information type '\warranty'
1> use acumen
2> go
1> select top 1 firstname, lastname from tblClients
2> go

[record returned]

(1 row affected)
1> quit

Next up it's necessary to configure ODBC: 接下来需要配置ODBC:

mlambie@ubuntu:/etc$ cat odbcinst.ini
[FreeTDS]
Description     = TDS driver (Sybase/MS SQL)
Driver          = /usr/lib/odbc/libtdsodbc.so
Setup           = /usr/lib/odbc/libtdsS.so
CPTimeout       =
CPReuse         =
FileUsage       = 1

mlambie@ubuntu:/etc$ cat odbc.ini
[ACUMENSERVER]
Driver          = FreeTDS
Description     = ODBC connection via FreeTDS
Trace           = No
Servername      = ACUMENSERVER
Database        = ACUMEN

I then tested the connection with isql: 然后我测试了与isql的连接:

mlambie@ubuntu:~$ isql -v ACUMENSERVER username password
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> use ACUMEN
[][unixODBC][FreeTDS][SQL Server]Changed database context to 'Acumen'.
[ISQL]INFO: SQLExecute returned SQL_SUCCESS_WITH_INFO
SQLRowCount returns -1
SQL> select top 1 firstname from tblClients;

[record returned]

SQLRowCount returns 1
1 rows fetched
SQL> quit

OK, so we've got ODBC using FreeTDS to connect to a remote MSSQL server. 好的,所以我们使用FreeTDS连接到远程MSSQL服务器的ODBC。 All that's left is to add Ruby into the mix. 剩下的就是将Ruby添加到组合中。

mlambie@ubuntu:~$ sudo aptitude install libdbd-odbc-ruby

The last thing to test is that Ruby can use DBI and ODBC to hit the actual database, and that's easy to test: 最后要测试的是Ruby可以使用DBI和ODBC来访问实际的数据库,这很容易测试:

mlambie@ubuntu:~$ irb
irb(main):001:0> require "dbi" 
=> true
irb(main):002:0> dbh = DBI.connect('dbi:ODBC:ACUMENSERVER', 'username', 'password')
=> #<DBI::DatabaseHandle:0xb7ac57f8 @handle=#<DBI::DBD::ODBC::Database:0xb7ac5744
@handle=#<odbc::database:0xb7ac576c>, @attr={}>, @trace_output=#</odbc::database:0xb7ac576c><io:0xb7cbff54>,
@trace_mode=2>
irb(main):003:0> quit

And a more complete test (only with SQL SELECT, mind you): 还有一个更完整的测试(只有SQL SELECT,请注意):

#!/usr/bin/env ruby

require 'dbi'
db = DBI.connect('dbi:ODBC:ACUMENSERVER', 'username', 'password')
select = db.prepare('SELECT TOP 10 firstname FROM tblClients')
select.execute
while rec = select.fetch do
  puts rec.to_s
end
db.disconnect
</io:0xb7cbff54>

From here (to fix the odbc lib being in the wrong place): http://ubuntuforums.org/showthread.php?t=433435&page=2 从这里(修复odbc lib在错误的地方): http//ubuntuforums.org/showthread.php?t = 43345&page = 2

libtdsodbc.so
with freeTDS (freetds-dev, tdsodbc), you can either edit the path in the odbcinst.ini file for the [FreeTDS] driver section OR cp the /usr/lib/odbc/libtdsodbc.so into /usr/lib/libtdsodbc.so.

either way works when accessing mssql from the prompt 从提示符访问mssql时,两种方式都有效

isql -v $dsn $user $passwd

i found this to be useful 我发现这很有用

http://www.unixodbc.org/doc/FreeTDS.html#Configuration http://www.unixodbc.org/doc/FreeTDS.html#Configuration

And then in the database.yml file: 然后在database.yml文件中:

development:
  adapter: sqlserver
  mode: odbc
  dsn: dsn_name
  username: my_username
  password: my_password

These are the steps i've compiled for Centos 5.3. 这些是我为Centos 5.3编译的步骤。 It took me a lot of trial and error to get this working. 为了让这个工作起来,我花了很多的试验和错误。 It's from a completely clean Centos installation. 它来自一个完全干净的Centos安装。

Install EPEL: 安装EPEL:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

Install ruby, rubygems, freetds, unixODBC, development tools: 安装ruby,rubygems,freetds,unixODBC,开发工具:

yum install gcc
yum install freetds
yum install ruby-devel
yum install unixODBC-devel
yum install ruby rubygems

Install rails: 安装导轨:

gem install rails

Install DB related gems: 安装与DB相关的宝石:

gem install dbd-odbc
gem install rails-sqlserver-2000-2005-adapter -s http://gems.github.com

Download, build and install ruby-odbc: 下载,构建和安装ruby-odbc:

wget http://www.ch-werner.de/rubyodbc/ruby-odbc-0.9997.tar.gz
tar zxvf ruby-odbc-0.9997.tar.gz
cd ruby-odbc-0.9997
ruby extconf.rb
make
make install

Final gem list: 最终宝石清单:

# gem list

*** LOCAL GEMS ***

actionmailer (2.3.2)
actionpack (2.3.2)
activerecord (2.3.2)
activeresource (2.3.2)
activesupport (2.3.2)
dbd-odbc (0.2.4)
dbi (0.4.1)
deprecated (2.0.1)
rails (2.3.2)
rails-sqlserver-2000-2005-adapter (2.2.17)
rake (0.8.7)

You can use various tools like isql to test your ODBC connection. 您可以使用各种工具(如isql)来测试ODBC连接。 Brian's post covers this in nice detail so I won't repeat. Brian的帖子详细介绍了这一点,所以我不再重复了。 In rails you need a database.yml that looks something like this: 在rails中你需要一个看起来像这样的database.yml:

development:
  adapter: sqlserver
  mode: odbc
  dsn: dsnName
  username: username
  password: password

On Ubuntu, I use FreeTDS and the activerecord-sqlserver-adapter gem. 在Ubuntu上,我使用FreeTDS和activerecord-sqlserver-adapter gem。

You can install FreeTDS through apt: 您可以通过apt安装FreeTDS:

sudo apt-get install freetds

And add this to your Gemfile: 并将其添加到您的Gemfile:

gem 'activerecord-sqlserver-adapter'

I had to change the configured FreeTDS version number in /etc/freetds/freetds.conf to 8.0 in order to get things working correctly. 我必须将/etc/freetds/freetds.conf配置的FreeTDS版本号更改为8.0才能使事情正常运行。

[global]
    tds version = 8.0

activerecord-sqlserver-adapter on GitHub GitHub上的activerecord-sqlserver-adapter

FreeTDS project FreeTDS项目

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

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