| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

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

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

目次

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

Database | SQL Server Compact | SQL Server | C Sharp |

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

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

1133 sqlsvrce01.jpg

参照設定

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

1135 sqlsvrce02.jpg

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

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

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

1136 sqlsvrce03.jpg

  • 登録された

1137 sqlsvrce04.jpg

プログラミング(SELECT例)

1138 sqlsvrce05.jpg

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();
            }
        }
    }
}

実行

1139 sqlsvrce06.jpg

データベースの作成

データ型

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());
}

1140 sqlsvrce07.jpg

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 とする

1141 sqlsvrce08.jpg

サンプルデータベースから作成

1142 sqlsvrce09.jpg

設定を確認して次へ

1134 sqlsvrce010.jpg

テーブルを選択

1143 sqlsvrce11.jpg

Northwind.edmxが作成された

1144 sqlsvrce12.jpg

System.Data.Entity.dll、System.Runtime.Serialization.dll、System.Security.dll の各アセンブリに参照

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

  • System.Data.Entity.dll

1145 sqlsvrce13.jpg

  • System.Runtime.Serialization.dll、System.Security.dll

1146 sqlsvrce14.jpg

App.Config
  • App.Configに設定が反映されていることを確認

1149 sqlsvrce17.jpg

<?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="Data Source=C:\work\Northwind.sdf"" 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");
        }
    }
}
実行例

1147 sqlsvrce15.jpg 1148 sqlsvrce16.jpg

モデルの更新

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

1132 entity framework01.jpg

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

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