SQL Server Compact 4.0を普通にADO.NETで使用する

現状のVS2010ではASP.NET以外のプロジェクトではSQL Server Compact 4.0(以降SQL CE 4)を使用することは普通には出来ません。普通には出来ないというのはIDE的にツールサポートがちゃんとしていない。とくにEntity Frameworkやデータバインド関係でということです。

ただし、ツールサポートがないだけで、WinFormsアプリケーションやコンソールアプリケーションからSQL CE 4を使用することは出来ます。

とりあえずWeb PIなどでSQL CE4を使うために必要なツール類を入手してインストールしてください。

今回はコンソールアプリケーションでの例を示します。

  1. コンソールアプリケーションのプロジェクトを作成します。
  2. プロジェクトの右クリックで追加→新しい項目を選択します。
  3. SQL Server Compact 4.0 ローカルデータベースを選択し、適当な名前をつけて追加ボタンをクリックします。今回の例だと「ce4_edmx.sdf」となります。
  4. 以下の例ではStudentというテーブルを作成し、そのテーブルには主キーとしてID列(int)、Name列(nvarchar(100))、Age列(int)を持っています。
  5. 以下の例のようにコードを追加します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlServerCe;

namespace CE4_EDMX
{
    class Program
    {
        static void Main(string[] args) {
            SqlCeConnectionStringBuilder builder = new SqlCeConnectionStringBuilder();
            builder.DataSource = "ce4_edmx.sdf";
            builder.Encrypt = false;
            builder.FileMode = "Read Write"; //http://msdn.microsoft.com/en-us/library/ms171817(v=SQL.110).aspx

            using (SqlCeConnection con = new SqlCeConnection(builder.ConnectionString)) {
                con.Open();
                string query = "INSERT INTO Student (Name, Age) VALUES (@name, @age)";
                using (SqlCeCommand cmd = new SqlCeCommand(query, con)) {
                    SqlCeParameter nameParam = new SqlCeParameter("@name", SqlDbType.NVarChar, 100);
                    cmd.Parameters.Add(nameParam);
                    SqlCeParameter ageParam = new SqlCeParameter("@age", SqlDbType.Int);
                    cmd.Parameters.Add(ageParam);
                    cmd.Parameters["@name"].Value = "Tadahiro Ishisaka";
                    cmd.Parameters["@age"].Value = 38;
                    cmd.ExecuteNonQuery();
                    Console.WriteLine("1行追加しました。");
                }
                query = "SELECT ID, Name, Age FROM Student";
                using(SqlCeCommand cmd = new SqlCeCommand(query, con)) {
                    SqlCeDataReader rd = cmd.ExecuteReader();
                    while (rd.Read()) {
                        Console.WriteLine("ID:{0}, Name:{1}, Age:{2}", rd[0], rd[1], rd[2]);
                    }
                }
            }


        }
    }
}

13行目から16行目では接続文字列をSqlCeConnectionStringBuilderを使用して作成しています。16行目はSDFファイルを開くときのモード指定で、無指定なら標準の”Read Write”です。この指定は文字列で、Enum等も用意されていないので、変更する場合にはリンク先を確認して文字列で指定します。

18行目からデータアクセスです。基本的にはSQL Serverに対してADO.NETで同期アクセスするコードを書いた経験があれば大体様子がわかるのではないかと思います。SQL CE 4のSQL文やデータ型はほぼSQL Serverと同じですが、構文的に多少違う点や、SQL CEには無いデータ型、型の制限が異なるケース(nvarcharにMAXが無いなど)などもあるので、SQL CEのドキュメントを確認してください。

昔懐かしいやり方でツールに頼らないようなコードを書けばツールサポートのないプラットフォームでもSQL CE 4を使うことが出来ます。「そこまで苦労する必要があって?」(脳内でセーラさんの声に変換)という問いには何とも答えようがないですが。

コメントを残す