!!!SQL Server Compact デスクトップ用アプリケーションの構築 [Database][SQL Server Compact][SQL Server][C#] *[Transact-SQL リファレンス|http://msdn.microsoft.com/ja-jp/library/bb510741.aspx] !!データ参照サンプルの作成 !Windowsアプリケーションプロジェクトの作成 {{ref_image sqlsvrce01.jpg}} !参照設定 *参照の追加ダイアログから、参照タブを選択 *%Program Files%\Microsoft SQL Server Compact Edition\v3.5\DeskTop から System.Data.SqlServerCe.dll を選択 {{ref_image sqlsvrce02.jpg}} !サーバーエクスプローラーにサンプルDBを接続 *サーバーエクスプローラー − データ接続 − 接続の追加 *サンプルDB(Northwind.sdf)を%ProgramFiles%\Microsoft SQL Server Compact Edition\v3.5\Samples から 適当なディレクトリにコピーしておく ""Windows Vista、Windows 7 を使用している場合、管理者以外のモードで Visual Studio を実行すると、Northwind.sdf に接続できない。Northwind.sdf に接続するには、データベース ファイルを Windows ディレクトリ、Program Files ディレクトリ、またはシステム ドライブに配置しないようにする。 {{ref_image sqlsvrce03.jpg}} *登録された {{ref_image sqlsvrce04.jpg}} !プログラミング(SELECT例) *クラスライブラリリファレンス http://msdn.microsoft.com/ja-jp/library/system.data.sqlserverce.aspx *複数行テキストボックスと、ボタンを配置 *ボタン押下で、テキストボックスにテーブルの値をセットさせる {{ref_image 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(); } } } } !実行 {{ref_image sqlsvrce06.jpg}} !!データベースの作成 !データ型 *[SQL Server Compact データ型|http://msdn.microsoft.com/ja-jp/library/ms172424.aspx] !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()); } {{ref_image sqlsvrce07.jpg}} !!Entity Framework *http://msdn.microsoft.com/ja-jp/library/cc835494.aspx *http://msdn.microsoft.com/ja-jp/library/bb399572.aspx 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 とする {{ref_image sqlsvrce08.jpg}} ::サンプルデータベースから作成 {{ref_image sqlsvrce09.jpg}} ::設定を確認して次へ {{ref_image sqlsvrce010.jpg}} ::テーブルを選択 {{ref_image sqlsvrce11.jpg}} ::Northwind.edmxが作成された {{ref_image 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 {{ref_image sqlsvrce13.jpg}} *System.Runtime.Serialization.dll、System.Security.dll {{ref_image sqlsvrce14.jpg}} ::App.Config *App.Configに設定が反映されていることを確認 {{ref_image sqlsvrce17.jpg}} !実装例(シンプルなクエリ、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 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"); } } } ::実行例 {{ref_image sqlsvrce15.jpg}} {{ref_image sqlsvrce16.jpg}} !モデルの更新 *http://msdn.microsoft.com/ja-jp/library/cc716705.aspx ::モデル ブラウザ ウィンドウで .edmx ファイルを右クリックし、データベースからモデルを更新 {{ref_image entity_framework01.jpg}} !オブジェクトの追加、変更、削除 http://msdn.microsoft.com/ja-jp/library/bb386870.aspx http://msdn.microsoft.com/ja-jp/library/bb386871.aspx