PDA で SQL Server Compact 3.5 を使う

PDA自体にデータベースを乗せる簡単な検証をしてみました。

極小SQL Server Compactでデータベース・アプリをお手軽作成
http://www.atmarkit.co.jp/fdotnet/joyofprogram/20080701devssce/devssce_01.html

利用方法としては、

– データベースをあらかじめ作成しておいて SD メモリに置く。
– アプリケーションからPDA上のDB(SDFファイル)を参照する。
– 無線LANなどが使えるときは、適宜DBをアップデートする。

ってな感じを想定しています。
DBのアップデートに関しては、地図や電話帳みたいな固定データは丸ごとPCからコピーしてもOK。
PDAで編集したメモ書きなんかは、適宜PCでマージしてやって(PDAでマージでもOK)、DBに書き戻すという方法がよいでしょう。

ActiveSync に関しては保留。中古でPDAを手に入れると大抵クレードルがありません(スタライスも無いことが多い)。なので、PDAとPCとのデータのやり取りは、

– SDメモリ経由
– CFカード経由
– 無線LAN
– Bluetooth

に限られます。赤外線でもいいけど、昨今のノートPCには赤外線が乗っていない機種が多いのでパス。
勿論、PDA自体に無線LAN/Bluetoothが乗っていない場合もあるわけですが、それはそれで(今時の)使い勝手を考えて現在保留。

さて、本題ですが、PDAでSQL Server Compact 3.5 を使うときは、System.Data.SqlServerCe 名前空間を使います。この中に SqlClient と同等のクラスが含まれています。
参照設定に「System.Data.SqlServerCe.dll」を追加します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlServerCe;

namespace DBAccess01
{
    public partial class Form1 : Form
    {

        private SqlCeConnection m_cn;
        private string m_ConnectString = "";
        
        public Form1()
        {
            InitializeComponent();
            //DBの位置
            System.Reflection.Module[] modules =
                System.Reflection.Assembly.GetExecutingAssembly().GetModules();
            string path = System.IO.Path.GetDirectoryName(modules[0].FullyQualifiedName);
            m_ConnectString = "Data Source=" +
                path + "\\AppDatabase1.sdf";
        }

        // 接続
        private void button1_Click(object sender, EventArgs e)
        {

            //MessageBox.Show(m_ConnectString);

            m_cn = new SqlCeConnection(m_ConnectString);
            try
            {
                m_cn.Open();
                MessageBox.Show("接続完了");
            }
            catch ( SqlCeException ex )
            {
                MessageBox.Show(ex.Message);
            }
        }
        // 切断
        private void button2_Click(object sender, EventArgs e)
        {
            if (m_cn != null)
            {
                m_cn.Close();
                MessageBox.Show("切断");
                m_cn = null;
            }
        }

        // 検索
        private void button3_Click(object sender, EventArgs e)
        {
            SqlCeConnection cn = new SqlCeConnection(m_ConnectString);
            SqlCeDataAdapter da = new SqlCeDataAdapter(
                "SELECT * FROM t_product", cn);
            DataTable dt = new DataTable();
            da.Fill(dt);
            this.dataGrid1.DataSource = dt;
        }
    }
}

接続文字列は

Data Source=SDFファイル名

のように指定します。上のソースではアプリケーション(EXEファイル)と同じ場所にあるSDFファイルを指定しています。

あと、PDA には .NET Compact Framework 3.5 と Microsoft SQL Server Compact Edition v3.5 なるものが必要です。.NET Compact Framework 3.5 のインストールに関しては、http://www.moonmile.net/blog/?p=82 を参照して貰うことにして、SQL Server Compact の方は Visual Studio 2008 をインストールしたときには、

C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\

にあります。
# 2005 とか Express Edition の場合はよくわからないのですが、先の「極小SQL Server Compactでデータベース・アプリをお手軽作成」の記事を眺めると結構大変そうなので、これはまた別の機会に。

この中にあるCABをインストールします。これはPDAによってCABが決まっています。

– sqlce.ppc.wce4.armv4.CAB

をPDAにインストール。そしてリセット(リセットしないと駄目らしい)。

SDメモリにサンプルで作成したファイルを入れます。

– DBAccess01.exe: 実行ファイル
– AppDatabase1.sdf: DBのファイル
– System.Data.SqlServerCe.dll: CE用DLL

で、実行したときの結果がこちら↓

SDメモリから直接起動

09-05-28_11-20

DataGridView に表示しているところ。

09-05-28_11-201

メモリの使用率が気になるところですが、今は測定していないので無視。

ちょっと気になったのが、

– varchar, char は無く、nvarchar, nchar で置き換える必要あり。
– ストアドプロシージャは作れない。
– レプリケーション機能がある。
– 日付型がdatetimeしかない。date型やtime型がない。

など細かな違いがあります。個人的には nvarchar に変換するのが面倒なのと、ストアドが無いってところですかね。システム関数はどこまで対応しているのか分かりませんが。

カテゴリー: PDA パーマリンク