none
SQL Server Compact Edition データベース(*.sdf)のテーブル間リレーションシップ作成方法 RRS feed

  • 質問

  • お世話になります。
    標記の件ですが、現在、開発環境としてVisual Studio2005を使用して、SQL Server Compact Editionデータベースを扱うデバイスアプリケーションを作成しようと考えています。

    まず、テーブルデザインをしようと思い、Visual Studio2005統合環境からサーバーエクスプローラーでSQL Server Compact Editionデータベースファイル(*.sdf)を作成し、テーブルを作成しました。
    そして、テーブル間のリレーションを作成しようと思ったのですが、その方法が見つかりません。

    Compact Editionではない普通のSQL Serverデータベースですと、データベースダイアグラムを作成・編集することでリレーションシップが作成できますが、SQL Server Compact Editionデータベースの場合は、サーバーエクスプローラー上にデータベースダイアグラムという項目が存在しないのです。

    また、それとは別に、データセットデザイナ上ではリレーションシップの編集が出来ますが、これは、データソース(この場合はSQL Server Compact Edition データベースファイル)からメモリ上にデータを読み出す入れ物の設計であって、データベースファイルのテーブル間のリレーションを作成するものではないと認識しています。

    どのようにすれば、テーブル間のリレーションを作成できるのかご教示いただけると幸いです。
    2007年1月15日 6:09

回答

  • こんにちは。

    テーブル側に作成する方法は無いと思います。
    SQL Server Compact Editionは、アプリケーションのプロセスで動作します。ですので、データベース側で制約を操作することと、データセット側が制約を操作することは、動作コスト的には同じです。どうしても必要ならデータセットで操作してください。
    データベース設計上の整合性制約は実現できないですから、単体での管理保守性は犠牲になりますが、かわりにコンパクトで動作コストの低いものになっているのだと思います。


    訂正です。上記記述は全て誤りです。
    CREATE TABLEおよびALTER TABLEにより、制約の作成が可能です。(リンクはいずれもSQL Server Compact Edition BOL)
    誤った回答で混乱を招きまして申し訳ありませんでした。
    2007年1月17日 3:04
  • SQL Server 2005 Service Pack 2 CTP の SQL Management Studio ならグラフィカルに管理できますが。
    2007年1月19日 23:31

すべての返信

  • こんにちは。

    テーブル側に作成する方法は無いと思います。
    SQL Server Compact Editionは、アプリケーションのプロセスで動作します。ですので、データベース側で制約を操作することと、データセット側が制約を操作することは、動作コスト的には同じです。どうしても必要ならデータセットで操作してください。
    データベース設計上の整合性制約は実現できないですから、単体での管理保守性は犠牲になりますが、かわりにコンパクトで動作コストの低いものになっているのだと思います。


    訂正です。上記記述は全て誤りです。
    CREATE TABLEおよびALTER TABLEにより、制約の作成が可能です。(リンクはいずれもSQL Server Compact Edition BOL)
    誤った回答で混乱を招きまして申し訳ありませんでした。
    2007年1月17日 3:04
  • 返信ありがとうございます。

    やはり簡単には出来ないのですね。
    また、データセットで操作するのが間違えた方法ではないとわかり、安心しました。
    最終的にうまくいかなかった場合は、データセット側で操作することにしたいと思います。

    ただ、このデータベースは、今後複数のアプリケーションで使用することが予定されており、出来ればデータベース上での制約が実現できればよいなと考えています。

    現状では、プログラムでテーブルを作成するSQLを発行すれば、テーブル間のリレーションも作成可能であることは確認できました。

    一応、サンプルコードを載せておきます。

                // データベースファイルの作成
                File.Delete(@"\My Documents\test1.sdf");
                SqlCeEngine engine = new SqlCeEngine(@"Data Source = \My Documents\test1.sdf");
                engine.CreateDatabase();

                // 接続
                SqlCeConnection ssceconn = new SqlCeConnection(@"Data Source = \My Documents\test1.sdf");
                ssceconn.Open();

                // テーブルの生成
                SqlCeCommand sqlCreateTable = ssceconn.CreateCommand();

                sqlCreateTable.CommandText =
                @"CREATE TABLE Machine("+
                    @"機種ID int IDENTITY(0,1) PRIMARY KEY,"+
                    @"機種名 nvarchar(32) UNIQUE NOT NULL"+
                @")";
                sqlCreateTable.ExecuteNonQuery();

                sqlCreateTable.CommandText =
                @"CREATE TABLE Spec("+
                    @"機種ID int REFERENCES Machine(機種ID)," +
                    @"対象名 nvarchar(7) NOT NULL,"+
                    @"rate1 float NOT NULL,"+
                    @"rate2 float NOT NULL,"+
                    @"PRIMARY KEY(機種ID, 対象名)"+
                @")";
                sqlCreateTable.ExecuteNonQuery();


    しかしながら、これでは保守性が悪く、出来れば、グラフィカルなツールでテーブル設計をしたいなと考えています。
    現在は、SQLサーバーデータベースをグラフィカルなツールで作成しておいて、これをプログラムでSQLサーバーCompactEditionデータベースファイルにレプリケーションする方法を検討しています。

    何か進展があったら、報告したいと思います。
    2007年1月19日 7:55
  • SQL Server 2005 Service Pack 2 CTP の SQL Management Studio ならグラフィカルに管理できますが。
    2007年1月19日 23:31
  • 上記記述(PostID=1117840)は誤りでした。

    本家MSDNフォーラムに回答がありました。
    訂正して、お詫びいたします。
    申し訳ありませんでした。
    2007年1月22日 13:08
  • こんにちは。

     おがわみつぎ さんからの引用
    SQL Server 2005 Service Pack 2 CTP の SQL Management Studio ならグラフィカルに管理できますが。


    SSMS Ver9.00.3033.00で試してみたのですが、方法がわかりませんでした。
    どうやって操作されたかお教えいただけると助かります。

    2007年1月22日 13:13
  • レプリケーションする方法がうまくいったので報告しておきます

    前提条件

    IISとSQL Server 2005がインストールされているPC
    当方は、WindowsXPなので、IISはXPに組み込まれているものを使いました。
    SQL Server 2005はVisual Studio 2005に同梱されているDevelopperエディションを使いました。
    サーバー環境構築の詳細は、SQL Server Books Onlineにあります。

    手順

    まず、SQL Server Management Studioを起動します。以下、全ての作業はこのツールで行います。

    1. SQL Server上でデータベースをデザインする。
    2. これに対して、レプリケーション→ローカルパブリケーションでマージパブリケーションを作成する。
    3. 接続→SQL Server Mobileで新規sdfを作成する。
    4. これに対して、レプリケーション→サブスクリプションを作成し、先に作成したパブリケーションを指定する。
    5. これでテーブル構造がコピーできたので、必ずこの時点でファイルをコピーしておく。
    6. サブスクリプションを削除(sdfから外部キーが削除されてしまう)
    7. パブリケーションを削除(テーブルに自動生成された制御用の列が削除される)


    問題点

    テーブルにuniqueidentifier型の列がない場合は、rowguidという名前で自動追加されてしまう。
    パブリケーションを削除することで、サーバー上のテーブルからは自動削除されるが、sdfファイルには残ったままとなってしまう。

    以上

    2007年1月30日 4:32