酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows MobileでSQL Server Compact Editionを使ってデータベースを扱う

最近では携帯電話も内部の構造が複雑化してきており、小さな組み込み機器ですがデータベースが搭載されています。Windows Mobileでも組込みデータベース(EDB)は以前のバージョンから使われていましたが、Windows Mobile 6.0からは本格的なRDBのSQL Server Compact Editionが標準で搭載されるようになりました。

SQL Server Compact Editionは、SQL Serverと比べると貧弱なモバイル端末で動作する組込みデータベースなので、非常にデータベース・エンジンのサイズがとても小さく作られています。但し、ボリュームを削った分、ストアドプロシージャは作れなかったり、日付型が datetimeしかなかったり、データベースのデータ領域が最大4GBまでだとかの制約は存在しています。

しかし、それ以上に使い勝手の良いDBMSを.NET CFから扱えるのは嬉しいです。.NET CF 3.5からはLINQ to SQLにも対応しています。SQL Server CompactとSQL Serverの相違点について、いくつか書かれたドキュメントがありますので以下のページをご参照下さい。

ここでは実際にSQL Server Compact Editionを使い、データベースの操作についてご紹介します。データベースを操作するには、Visual StudioでGUIを使う方法とプログラムからを使う方法があります。

GUIからデータベースを操作する

Visual StudioのデータベースエクスプローラーからGUIを使って、データベースを操作する事が出来ます。

データベースの作成

まずはデータベースを作成します。

データソースエクスプローラの「新しいデータソースの追加」を選択します。

f:id:ch3cooh393:20141015153432p:plain

データベースを選択して「次へ」を選択します。

f:id:ch3cooh393:20141015153500p:plain

新しい接続を選択します。

f:id:ch3cooh393:20141015153525p:plain

データソースには、Microsoft SQL Server 2005 Compact Editionを選択します。

f:id:ch3cooh393:20141015153548p:plain

接続の追加ダイアログが表示されます。接続のプロパティのテキストボックスのデータベース欄へ「database.sdf」、パスワード欄へ「password!123」を入力し、データベース欄の下の「作成」を押下します。

f:id:ch3cooh393:20141015153611p:plain

データベースの新規作成ダイアログが表示されますので、「OK」を押下しデータベースを作成します。

f:id:ch3cooh393:20141015153635p:plain

作成したデータベースにテスト接続します。「接続の確認」を押下し、先ほど作成したデータベースに接続可能か確認します。問題がなければ「OK」を押下し次へ進めます。

f:id:ch3cooh393:20141015153659p:plain

「重要情報を接続文字列に追加します。」を選択し、「次へ」を押下します。

f:id:ch3cooh393:20141015153723p:plain

「選択された接続は、現在のプロジェクトにはないローカルデータファイルを使用します~」というダイアログが出たらはいを選択します。

f:id:ch3cooh393:20141015153746p:plain

「完了」を押下してデータベースの設定は完了です。

f:id:ch3cooh393:20141015153806p:plain

テーブルの作成

データベースの作成が完了したので、次にテーブルを作成します。ソリューション・エクスプローラに表示されているデータセット databaseDataSet.xsdをダブルクリックすると、データセット・デザイナが表示されます。このデザイナではデータセットの内容を編集します。

f:id:ch3cooh393:20141015153853p:plain

サーバーエクスプローラ上で、先程作成したデータベースからテーブルを作成します。

f:id:ch3cooh393:20141015153904p:plain

サーバーエクスプローラから作成したテーブルをデータセット・デザイナ上へドラッグ&ドロップします。データセット・デザイナ上にテーブルのスキーマが表示されます。

f:id:ch3cooh393:20141015153915p:plain

データグリッドへの表示

フォームにDataGridコントロールを配置し、データベースの内容を表示します。DataSourceプロパティへ作成したデータテーブルを指定すると、変更に合わせてDataGridコントロールが更新されるようになります。

f:id:ch3cooh393:20141015153949p:plain

実際にDataGridコントロールが更新されると、下記の様にDataGridコントロールの表示が更新されます。

f:id:ch3cooh393:20141015153957p:plain

プログラムから操作する

ここまでは、データベースの作成をVisual StudioのGUIで行ってきましたが、実際に使用するにはプログラムからデータを参照したり追加や削除を行う必要があります。ここではプログラムでSQL Server Compact Editionの操作を行います。

データベースの作成

MSDNによるとデータベースファイルは事前に作成しておく事が推奨されておりますが、動的にデータベースを作成する必要がある場合等、プログラムを使ってデータベースを作成する事が可能です。 SQL Server Compact Editionの機能を利用するには、System.Data.SqlServerCe.dllのアセンブリを参照する必要があります。 SqlCeEngineクラスのCreateDatabaseメソッドを使用すると、データベースファイル(database.sdf)が作成されます。

private void CreateDataBase()
{
  // 作成するデータベースへの接続文字列を定義
  string conStr = "Data Source=|DataDirectory|\\database.sdf";
  
  System.Data.SqlServerCe.SqlCeEngine engine 
    = new System.Data.SqlServerCe.SqlCeEngine(conStr);
  
  // データベースを作成する
  engine.CreateDatabase();
}

SQLの発行

データベースファイル(前述のサンプルコードではdatabase.sdf)が作成出来ました。次にテーブルを定義し、テーブルに対してレコードを追加するSQLを発行します。SQL文としては以下の2つになります。

CREATE TABLE STAFF_TBL( 
  ID INTEGER PRIMARY KEY
  , NAME NVARCHAR(20)
  , AGE INTEGER
)

INSERT STAFF_TBL(ID, NAME, AGE)
VALUES (1, 'CH3COOH(酢酸)', 27) 

SqlCeConnectionクラスのコンストラクタで渡した接続文字列を使用し、Openメソッドでデータベースとの接続を開始します。以下の通り、SQLを発行する為のメソッドを予め作成しておきます。

private void ExecuteQuery(string query)
{
  // 作成するデータベースへの接続文字列を定義
  string conStr = "Data Source=|DataDirectory|\\database.sdf";
  
  // 接続文字列を渡しSqlCeConnectionオブジェクトを生成
  using (System.Data.SqlServerCe.SqlCeConnection con
    = new System.Data.SqlServerCe.SqlCeConnection(conStr))
  {
    // データベースを開く
    con.Open();
    
    // コマンドの実行
    System.Data.SqlServerCe.SqlCeCommand cmd = con.CreateCommand();
    cmd.CommandText = query;
    cmd.ExecuteNonQuery();
  }
}

ボタンがクリックされると以下のメソッドを実行します。

private void button1_Click(object sender, EventArgs e)
{
  // テーブル「STAFF」を作成する為のSQL文
  string createTableSql = string.Empty;
  createTableSql += "CREATE TABLE STAFF_TBL ";
  createTableSql += "( ";
  createTableSql += "  ID   INTEGER PRIMARY KEY, ";
  createTableSql += "  NAME NVARCHAR(20), ";
  createTableSql += "  AGE  INTEGER ";
  createTableSql += ") ";
      
  // テーブル「STAFF」にレコードを追加するSQL文
  string insertStaffSql = string.Empty;
  insertStaffSql += "INSERT STAFF_TBL(ID, NAME, AGE) ";
  insertStaffSql += "VALUES (1, 'CH3COOH(酢酸)', 27) ";
  
  // 作成するデータベースへの接続文字列を定義
  string conStr = "Data Source=.\\database.sdf";
  
  // テーブル「STAFF」を作成する
  ExecuteQuery(conStr, createTableSql);
  
  // テーブル「STAFF」にレコードを追加する
  ExecuteQuery(conStr, insertStaffSql);
}