2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ruby+Sequel+win32oleでパスワード付きSQL Server Compact (.sdfファイル)にアクセスする方法

Last updated at Posted at 2015-06-03

結論だけ読みたい人へ

# 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

などでお好きな様に

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?