結論だけ読みたい人へ
# ruby
require "sequel"
DB = Sequel.ado(:conn_string=>'Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;'\
'Data Source=.\db.sdf;ssce:database password=hoge',
:driver=>'SQL CE')
# driverに適当な文字列設定しないとMSSQLとみなされて非対応コマンド送りつけられる
昔の話
SQL Server Compact EditionなるMS版SQLiteみたいなのがあったらしい
.net+EntityFrameworkとやらでそれなりにお手軽に扱えてたらしい
今の話
理由までは知らないがMSさんが今後非推奨な
って言い出したので下火
残された遺産としてたまにsdfファイルに遭遇すると困る
「ADO.NETで接続できるらしい」
という情報は見つかるが、.Net Framework使いたくない事もあるよね
ADO(非.NET)でも接続できるらしい
ADO素人が頑張って探したところ、
Provider=System.Data.SqlServerCe.4.0;
がADO.NET用で
Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;
がADO用のProviderらしい
:conn_string=>'Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;'\
'Data Source=.\db.sdf;Password=hoge'
でいけるんじゃないかなと思ってたが失敗
頑張って更に探したところ
http://stackoverflow.com/questions/4991694/ado-connection-to-sql-server-compact-edition-4-0
を見つける
どうやらパスワードは
ssce:database password=hogeにするらしい
実験
# irb -rsequel
irb(main):001:0> DB = Sequel.ado(:conn_string=>'Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;'\
irb(main):002:1* 'Data Source=.\db.sdf;ssce:database password=hoge')
=> #<Sequel::ADO::Database: {:adapter=>:ado, :conn_string=>"Provider=Microsoft.S
QLSERVER.CE.OLEDB.4.0;Data Source=.\\db.sdf;ssce:database password=hoge
kwalker"}>
irb(main):003:0> DB["select * from fuga"].all
=> #省略
おし、fugaテーブルの中身が取れた
そう喜んでたが、
irb(main):004:0> DB[:fuga].all
Sequel::DatabaseError: WIN32OLERuntimeError: (in OLE method `Execute': )
OLE error code:80040E14 in Microsoft SQL Server Compact OLE DB Provider
�R�}���h�������� 1 �ȏ�̃G���[���������܂
��B
HRESULT error code:0x80020009
Exception occurred.
文字化けして読めないけど80040E14エラーですって
Sequelのソース読んだら、どうやらADO接続時に:driverを指定しないとMS SQLServerだと思って
SELECT CAST(SERVERPROPERTY('ProductVersion') AS varchar)
を投げつけるがCompactEditionでは非対応らしい
結論
冒頭でも提示したが
# ruby
require "sequel"
DB = Sequel.ado(:conn_string=>'Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;'\
'Data Source=.\db.sdf;ssce:database password=hoge',
:driver=>'SQL CE')
# driverに適当な文字列設定しないとMSSQLとみなされて非対応コマンド送りつけられる
でカレントディレクトリ内のdb.sdfファイルをパスワードhogeで開けます。
後は、
DB[:fuga].where(:name => "ほげほげ").all
などでお好きな様に