最近では携帯電話も内部の構造が複雑化してきており、小さな組み込み機器ですがデータベースが搭載されています。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を使って、データベースを操作する事が出来ます。
データベースの作成
まずはデータベースを作成します。
データソースエクスプローラの「新しいデータソースの追加」を選択します。
データベースを選択して「次へ」を選択します。
新しい接続を選択します。
データソースには、Microsoft SQL Server 2005 Compact Editionを選択します。
接続の追加ダイアログが表示されます。接続のプロパティのテキストボックスのデータベース欄へ「database.sdf」、パスワード欄へ「password!123」を入力し、データベース欄の下の「作成」を押下します。
データベースの新規作成ダイアログが表示されますので、「OK」を押下しデータベースを作成します。
作成したデータベースにテスト接続します。「接続の確認」を押下し、先ほど作成したデータベースに接続可能か確認します。問題がなければ「OK」を押下し次へ進めます。
「重要情報を接続文字列に追加します。」を選択し、「次へ」を押下します。
「選択された接続は、現在のプロジェクトにはないローカルデータファイルを使用します~」というダイアログが出たらはいを選択します。
「完了」を押下してデータベースの設定は完了です。
テーブルの作成
データベースの作成が完了したので、次にテーブルを作成します。ソリューション・エクスプローラに表示されているデータセット databaseDataSet.xsdをダブルクリックすると、データセット・デザイナが表示されます。このデザイナではデータセットの内容を編集します。
サーバーエクスプローラ上で、先程作成したデータベースからテーブルを作成します。
サーバーエクスプローラから作成したテーブルをデータセット・デザイナ上へドラッグ&ドロップします。データセット・デザイナ上にテーブルのスキーマが表示されます。
データグリッドへの表示
フォームにDataGridコントロールを配置し、データベースの内容を表示します。DataSourceプロパティへ作成したデータテーブルを指定すると、変更に合わせてDataGridコントロールが更新されるようになります。
実際にDataGridコントロールが更新されると、下記の様にDataGridコントロールの表示が更新されます。
プログラムから操作する
ここまでは、データベースの作成を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); }