読者です 読者をやめる 読者になる 読者になる

SQL Serverを使う

HowtoConnectToMicrosoftSQLServerを参考にやってみました。
まず、以下のコマンドで、activerecord-sqlserver-adapterをインストールします。--sourceオプションでのURLの指定は必須です。

gem install activerecord-sqlserver-adapter --source=http://gems.rubyonrails.org 

次にSQL Serverに接続するためのRuby-DBIライブラリをインストールします。こちらからダウンロードして、"lib/dbd/ADO.rb"を、Rubyをインストールしたディレクトリの"lib/ruby/site_ruby/1.8/DBD/ADO/"にコピーします。

これだけでOKなはずなのですが、以下のコマンドでDBMSを指定してアプリケーションを作成しようとすると、sqlserverが認識されていないようでしたので、

rails -d sqlserver testproj

とりあえず標準(SQLite3)で作成して、database.yamlを以下のように変更しました(development以外も同様)。

development:
  adapter: sqlserver
  database: testproj_development
  host: localhost
  username: sa    # 接続アカウント(今回は混合認証を使用)
  password: pass  # 接続パスワード

SQL Serverの方で指定したデータベースを作成し、マイグレーションを実行したところ、とりあえず動作はしたのですが、以下のような問題がありました。

  1. 全角文字を含むデータをインサートするとエラーが発生する(fixtureも)
  2. SQL Serverに直接インサートした全角文字を含むデータを、Railsから取得すると文字化けする

1点目は、具体的には以下のエラーがログに出力されていました。

ActiveRecord::StatementInvalid (DBI::DatabaseError: Execute
    OLE error code:80040E14 in Microsoft OLE DB Provider for SQL Server
      行 1: '20080731' の近くに無効な構文があります。
    HRESULT error code:0x80020009
      例外が発生しました。: INSERT INTO [categories] ([name], [updated_at], [note], [created_at]) VALUES('繝�せ繝�, '20080731 06:55:17', '', '20080731 06:55:17')):

INSERT分で、nameのデータの"'"がなくなってしまっているように見えます。fixturesファイルをShift_JISにしてみるとOKなかったので、文字コード関連で何か問題がありそうです。2点目もSQL ServerからのデータがShift_JISで渡されているのが原因のようです。検索してみたところ、、

こちらのページを参考にさせていただき解決することができました。ありがとうございました。
具体的には、config/environment.rbに以下の記述を追加します。

require 'win32ole'
WIN32OLE.codepage = WIN32OLE::CP_UTF8

これでSQL Serverとのやり取りがUTF8になります。