ローカルデータベースである SQL Server Compact Edition を使う

SQL Server や MySQL は、ローカルコンピュータにデータベースをインストールしないといけないので、業務先のコンピュータにインストールするにはちょっと、という感じがします(まぁ、そういう場合は別途サーバー機を作るわけですが)。
逆に、データベース専用にサーバーを作るほどでもない、あるいは、個々のアプリケーションのデータを database として保存しておきたい場合は、「ファイルベース」のデータベースを使うと良いです。
筆頭に上がるのが、SQLite で、データベースのファイルをコピーするだけで使えます。この他にも、

  • xml 形式のファイルをデータベースとして扱う。
  • access 形式ファイルを扱う。
  • Berkeley DB を使う。

という方法もあります。

で、実は余り知られていない(と思う)のですが、SQL Server 互換のファイルベースのデータベースがあります。

ダウンロード詳細 Windows デスクトップ向け Microsoft SQL Server Compact 3.5 および Microsoft Synchronization Services for ADO.Net v1.0
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=7849b34f-67ab-481f-a5a5-4990597b0297
ダウンロード詳細 Windows デスクトップ用 Microsoft SQL Server Compact 3.5 Service Pack 2
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=e497988a-c93a-404c-b161-3a0b323dce24
SQL Server Compact 3.5 オンライン ブック
http://msdn.microsoft.com/ja-jp/library/bb734673(v=sql.100).aspx

と前置きはこれくらいにして、SQLite を使うのもいいけど、compact edition もね、という感じで。compact edition に関しては、windows ce の頃に調べていたのですが、windows phone 7 の場合はどうなんでしょうねえ。次期モバイルには入るらしいのですが。

■ローカルデータベースを追加

visual studio にローカルデータベース(compact edition)を追加します。拡張子は「sdf」ですね。ちなみに、「サービスベースのデータベース」というのは、本家の sql server が使うデータベースファイルです。こっちの拡張子は「mdf」です。

Visual Studio 2010 で作成されるローカルデータベースは、v3.5 のプロバイダでアクセスしています。
「System.Data.SqlServerCe.3.5」のところ。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <connectionStrings>
 <add name="Model1Container" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlServerCe.3.5;provider connection string=&quot;Data Source=|DataDirectory|\Database1.sdf&quot;" providerName="System.Data.EntityClient" />
 </connectionStrings>
</configuration>

■Entity Model を作成

ちょっと工夫が要りますが、Enity Model を作成します。初期値は「Model1Container」になってます。

[img 20120110_05.jpg]

作成されたスクリプトはこんな感じ

-- --------------------------------------------------
-- Creating all tables
-- --------------------------------------------------

-- Creating table 'Company'
CREATE TABLE [Company] (
    [ID] int IDENTITY(1,1) NOT NULL,
    [Name] nvarchar(100)  NOT NULL
);
GO

-- Creating table 'Person'
CREATE TABLE [Person] (
    [ID] int IDENTITY(1,1) NOT NULL,
    [Name] nvarchar(100)  NOT NULL,
    [Age] int  NULL,
    [UpdateDate] datetime  NOT NULL,
    [Company_ID] int  NULL
);
GO

-- --------------------------------------------------
-- Creating all PRIMARY KEY constraints
-- --------------------------------------------------

-- Creating primary key on [ID] in table 'Company'
ALTER TABLE [Company]
ADD CONSTRAINT [PK_Company]
    PRIMARY KEY ([ID] );
GO

-- Creating primary key on [ID] in table 'Person'
ALTER TABLE [Person]
ADD CONSTRAINT [PK_Person]
    PRIMARY KEY ([ID] );
GO

-- --------------------------------------------------
-- Creating all FOREIGN KEY constraints
-- --------------------------------------------------

-- Creating foreign key on [Company_ID] in table 'Person'
ALTER TABLE [Person]
ADD CONSTRAINT [FK_CompanyPerson]
    FOREIGN KEY ([Company_ID])
    REFERENCES [Company]
        ([ID])
    ON DELETE NO ACTION ON UPDATE NO ACTION;

-- Creating non-clustered index for FOREIGN KEY 'FK_CompanyPerson'
CREATE INDEX [IX_FK_CompanyPerson]
ON [Person]
    ([Company_ID]);
GO

compact edtion の場合は、文字列は nvarchar に統一されています。なので、sql server からスクリプトを流用するときは、ちょっと変換が必要ですね。

■接続テスト

簡単な接続テスト

///
/// 接続テスト
///
/// <param name="sender" />
/// <param name="e" />
private void button1_Click(object sender, EventArgs e)
{
	Model1Container ent = new Model1Container();
	var persons = from t in ent.Person select t;
	dataGridView1.DataSource = persons;
}

ナビゲーションプロパティを使って person と company を結合。

///
/// リンク付きで検索
///
/// <param name="sender" />
/// <param name="e" />
private void button2_Click(object sender, EventArgs e)
{
	Model1Container ent = new Model1Container();
	var items = from t in ent.Person
				orderby t.Age
				select new {
					t.Name,
					t.Age,
					CompanyName = t.Company.Name };
	dataGridView1.DataSource = items;
}

データベースファイル自体は、「Database1.sdf」というひとつのファイルになるので、これをコピーすればどこでも使えます。ああ、あと .net framework 4.0 も必要ですが。

.NET Framework 4 ダウンロード: SDK | MSDN
http://msdn.microsoft.com/ja-jp/netframework/ff687189

ダウンロード詳細 Windows デスクトップ用 Microsoft SQL Server Compact 3.5 Service Pack 2
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=e497988a-c93a-404c-b161-3a0b323dce24


追記
SQL Server Compact の場合は、実行ファイルとデータベースファイル(*.sdf)をコピーすれば動くのかと思ったら、別途 SQL Server Compact 3.5 等のインストールが必要になる模様。動かしたときに、プロバイダーが作成できない、という例外が発生する。なので、クリーンなクライアントマシンで単純コピーでは動かないから、数百台のインストールのようなものが発生する場合は、SQLite のほうがいいのかなぁ。できれば、SQL Server Compact のインストールはしたくないので(.NET Framework 4.0 は仕方がないにしても)、適当なアセンブリ(*.dll)をコピーすれば、クリーンな windows 7 マシンでも動作する、っていうのがいいなぁ。

 

カテゴリー: 開発, C# パーマリンク

ローカルデータベースである SQL Server Compact Edition を使う への1件のコメント

  1. 店内全品半額以下SALE のコメント:

    ハウディ と協力利用あなたがしているあなたは私がどのWebホスト知らせる気にしますか?その後、ほとんどの| 速く速く と私は、このブログは多くのことをロードすると言わなければならない| 異なる全く異なる私は3であなたのブログをロードしました。あなたがすることができます価格 でプロバイダ|良い 示唆をお勧めしますか? 栄誉、私はそれを感謝します!
    店内全品半額以下SALE http://kiyoto.tokyo/?class81=24948

コメントは停止中です。