トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

SQL Server Compact デスクトップ用アプリケーションの構築



目次



記事一覧

キーワード

SQL Server Compact デスクトップ用アプリケーションの構築

[Database][SQL Server Compact][SQL Server][C#]

 データ参照サンプルの作成

Windowsアプリケーションプロジェクトの作成

参照設定

  • 参照の追加ダイアログから、参照タブを選択
  • %Program Files%\Microsoft SQL Server Compact Edition\v3.5\DeskTop から System.Data.SqlServerCe.dll を選択

サーバーエクスプローラーにサンプルDBを接続

  • サーバーエクスプローラー − データ接続 − 接続の追加
  • サンプルDB(Northwind.sdf)を%ProgramFiles%\Microsoft SQL Server Compact Edition\v3.5\Samples から 適当なディレクトリにコピーしておく

Windows VistaWindows 7 を使用している場合、管理者以外のモードで Visual Studio を実行すると、Northwind.sdf に接続できない。Northwind.sdf に接続するには、データベース ファイルを Windows ディレクトリ、Program Files ディレクトリ、またはシステム ドライブに配置しないようにする。



  • 登録された

プログラミング(SELECT例)

Form1.cs にコーディング
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlServerCe;

namespace SQLServerCeTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string conn_str = @"Data Source=C:\work\Northwind.sdf";
            SqlCeConnection conn = new SqlCeConnection(conn_str);
            conn.Open();

            SqlCeCommand cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT [Customer ID], [Company Name] FROM Customers";
            SqlCeDataReader reader = cmd.ExecuteReader();

            try
            {
                while (reader.Read())
                {
                    String customer_id = reader.GetString(0);
                    String company_name = reader.GetString(1);
                    textBox1.AppendText(customer_id + "\t" + company_name + "\n");
                }
            }
            finally
            {
                reader.Close();
                conn.Close();
            }
        }
    }
}

実行

 データベースの作成


データ型

Engineオブジェクトを使用してデータベースを作成

string db_file = @"c:\work\test.sdf";
if (File.Exists(db_file))
{
    MessageBox.Show("すでに存在しています。");
} else {
    string conn_str = @"Data Source=" + db_file;
    SqlCeEngine engine = new SqlCeEngine(conn_str);
    engine.CreateDatabase();
    engine.Dispose();
    MessageBox.Show("作成しました。");
}

  • パスワード、暗号化等のオプションを指定してデータベースを作成
SqlCeEngine engine = new SqlCeEngine();
engine .LocalConnectionString= "Data Source='Test.sdf'; LCID=1033;" +
  "Password='s$;2'!dS64'; Encrypt = TRUE;";
SqlCeEngine engine = new SqlCeEngine();

 テーブルの作成とエラー処理


try
{
    string conn_str = @"Data Source=c:\work\test.sdf";
    SqlCeConnection conn = new SqlCeConnection(conn_str);
    conn.Open();
    SqlCeCommand cmd = conn.CreateCommand();
    cmd.CommandText = @"CREATE TABLE MyCustomers (CustID int IDENTITY (100,1) PRIMARY KEY, CompanyName nvarchar (50))";
    cmd.ExecuteNonQuery();
}
catch (SqlCeException sqle)
{
    Exception inner = sqle.InnerException;
    if (inner != null)
    {
        MessageBox.Show(inner.ToString());
    }
    StringBuilder buf = new StringBuilder();
    foreach (SqlCeError err in sqle.Errors)
    {
        buf.Append("\n Error Code : " + err.HResult.ToString("X"));
        buf.Append("\n Message    : " + err.Message);
    }
    MessageBox.Show(buf.ToString());
}

 データの挿入

try
{
    string conn_str = @"Data Source=c:\work\test.sdf";
    SqlCeConnection conn = new SqlCeConnection(conn_str);
    conn.Open();
    SqlCeCommand cmd = conn.CreateCommand();

    string[] companies = { "CompanyAAA", "CompanyBBB", "CompanyCCC", "CompanyDDD" };
    foreach (string company in companies)
    {
        cmd.CommandText = @"INSERT INTO MyCustomers(CompanyName) VALUES( '" + company + "')";
        cmd.ExecuteNonQuery();
    }
}
catch (SqlCeException sqle)
{
    Exception inner = sqle.InnerException;
    if (inner != null)
    {
        MessageBox.Show(inner.ToString());
    }
    StringBuilder buf = new StringBuilder();
    foreach (SqlCeError err in sqle.Errors)
    {
        buf.Append("\n Error Code : " + err.HResult.ToString("X"));
        buf.Append("\n Message    : " + err.Message);
    }
    MessageBox.Show(buf.ToString());
}

 Entity Framework


ADO.Net Entity Framework

  • データ指向ソフトウェア アプリケーションの開発をサポートする ADO.NET の一連のテクノロジ
  • オブジェクトやプロパティの形式のデータを操作することができ、そのデータが格納されている基になるデータベースのテーブルや列のことを気にする必要がなくなる。
  • 高度な抽象化レベルでデータを操作できるため、特定のデータ ストレージ エンジンやリレーショナル スキーマに依存しないコードを作成できる。
  • 直接リレーショナル ストレージ スキーマに対してプログラミングを行うのではなく、アプリケーションの概念モデルに対してプログラミングを行うことによってデータ アクセス アプリケーションを作成できる。

Entity Framework インストール

  • NET Framework 3.5 Service Pack 1 (SP1) 以降の .NET Framework のコンポーネント
  • Visual Studio における Entity Framework に対する Entity Data Model Designer のサポートは、Entity Framework Tools で提供
  • Entity Data Model Designerは、Visual Studio 2008 Service Pack 1以降の Visual Studio のコンポーネントで、エンティティ データ モデルの作成や編集に使用されるビジュアル ツール

System.Data.SQLServerCe.Entity.dll

  • System.Data.SQLServerCe.Entity.dll アセンブリは、ADO.NET マネージ データ プロバイダの System.Data.SqlServerCE.dll によって内部で使用され、エンティティ データ モデル (EDM) に記述されているデータへのアクセスをサポート
  • %ProgramFiles%\Microsoft SQL Server Compact Edition\v3.5 フォルダにインストールされる

サンプルデータベース(Northwind)からの作成例

プロジェクト − 新しい項目の追加
  • テンプレートペインで、ADO.NET エンティティ データ モデル を選択
  • ファイル名を Northwind.edmx とする
サンプルデータベースから作成
設定を確認して次へ
テーブルを選択
Northwind.edmxが作成された
System.Data.Entity.dll、System.Runtime.Serialization.dll、System.Security.dll の各アセンブリに参照

%ProgramFiles%\Microsoft SQL Server Compact Edition\v3.5

  • System.Data.Entity.dll
  • System.Runtime.Serialization.dll、System.Security.dll
App.Config
  • App.Configに設定が反映されていることを確認
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="NorthwindEntities" connectionString="metadata=res://*/Northwind.csdl|res://*/Northwind.ssdl|res://*/Northwind.msl;provider=System.Data.SqlServerCe.3.5;provider connection string=&quot;Data Source=C:\work\Northwind.sdf&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

実装例(シンプルなクエリ、LINQ、オブジェクトクエリ)

シンプルなクエリ
using (EntityConnection conn = new EntityConnection("Name = NorthwindEntities"))
{
    conn.Open();

    EntityCommand cmd = conn.CreateCommand();
    cmd.CommandText = @"Select Cust.Customer_Id as Id, Cust.Company_Name as Name from NorthwindEntities.Customers as Cust order by Cust.Customer_Id";
    EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
    while (reader.Read())
    {
        for (int i = 0; i < reader.FieldCount; i++)
        {
            textBox1.AppendText(reader[i].ToString() + "\t");
        }
        textBox1.AppendText("\n");
    }
}
LINQを利用したクエリ
using(NorthwindEntities entities = new NorthwindEntities()){
    IQueryable<string> customers =
        from c in entities.Customers select c.Company_Name;
    
    foreach (string c in customers)
    {
        textBox1.AppendText(c + "\n");
    }
}

オブジェクトクエリ
using (EntityConnection conn = new EntityConnection("Name = NorthwindEntities"))
{
    conn.Open();
    using (NorthwindEntities entities = new NorthwindEntities(conn))
    {
        foreach (Customers c in entities.Customers)
        {
            textBox1.AppendText(c.Customer_ID + "\t" + c.Company_Name + "\n");
        }
    }
}
実行例

モデルの更新

モデル ブラウザ ウィンドウで .edmx ファイルを右クリックし、データベースからモデルを更新

オブジェクトの追加、変更、削除

http://msdn.microsoft.com/ja-jp/library/bb386870.aspx
http://msdn.microsoft.com/ja-jp/library/bb386871.aspx



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.