SQL Server Compact 3.5 データベースを含んだVB2008アプリケーションを作成しております。

clickonceを使用して配布を考えているのですが、一部問題が発生して解決できないでおります。
問題とは、初期インストール時は問題ないのですが、バージョンアップで自動的にプログラムをインストール
する場合、データベースが上書きされてしまうということです。
データが消えるというのは運用上非常にまずいです。

ということで、データベース構造に変更がなければ上書きしないというような設定はできないのでしょうか。

バージョンアップ時にSDFファイルを含めないということも試しました。
これは既にインストールしている場合は、問題ないのですが、
最新のバージョンで初期インストールすると、sdfが含まれない状態となりエラーとなってしまいます。

バージョンを指定した初期インストールが可能で、その後最新にバージョンアップことができないか
調べましたが結局わからずじまいです。

msdnにも特にこのことに関する記事を見つけることができませんでした。
http://msdn.microsoft.com/ja-jp/library/aa983326.aspx

なにかうまい方法をご存知の方ご回答をよろしくお願いします。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/01/25 06:20:01
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tsukasa57 No.2

回答回数110ベストアンサー獲得回数20

ポイント50pt

とても気になって調べてみたのですが、*.sdf ではなく、*.txt で実験したところ、

データディレクトリに格納されたファイルは、上書きされませんでした。

私の環境は Visual Studio 2005 + Windows 2000 SP4 ですが...


  1. ClickOnce でアプリケーション(とテキストファイル)を配布
  2. Data ディレクトリに格納された *.txt を直接編集してみた。
  3. アプリケーションを変更して(つまりバージョンアップして)ClickOnce で配布
  4. アプリケーションを実行。

アプリケーションを実行すると、アプリケーションは正常に更新された。

データファイルを確認すると、2) で直接編集した内容が維持されていた。

データファイルは、次のように 2 つのディレクトリに格納される(X,Y,Zの部分は省略)。

C:\Documents and Settings\administrator\Local Settings\Apps\2.0\Data\XXX\YYY\ZZZ01\Data

C:\Documents and Settings\administrator\Local Settings\Apps\2.0\Data\XXX\YYY\ZZZ02\Data

これは、ClickOnce の仕様でバージョンアップする前に戻すことが出来るようにするため。

2) でこのディレクトリに格納されたファイルを編集して、4) でバージョンアップすると

2) で編集したファイルがコピーされる。


...あれ、これって、期待されている動作なのでは...

設定状況のスクリーンショット

http://f.hatena.ne.jp/tsukasa57/20090123023447

http://f.hatena.ne.jp/tsukasa57/20090123023446


できれば「この質問・回答へのコメント」欄でコメントを受け付けるようにして欲しいです。

id:kappapa

同じような感じで確認してみました。

※DBを直接編集ではなくアプリで追加変更しています。

バージョンアップしたときに、直前バージョンのDBファイルはコピーされませんでした。

Ver1.0.0.38での状態

http://f.hatena.ne.jp/kappapa/20090125051146

バージョンアップにて1.0.0.39に

http://f.hatena.ne.jp/kappapa/20090125051144

発行の設定状況

http://f.hatena.ne.jp/kappapa/20090125051145

発行したファイル群

http://f.hatena.ne.jp/kappapa/20090125051143

発行状況に違いがあるようなので、[データ ファイル (自動)]から[データ ファイル ]

へ変更して発行してみたところ、うまくコピーできました。(期待している動作)

ありがとうございました。

以前に、発行の状況を色々変更して試してみたつもりなんですが。

とりあえず、これでしばらく様子をみてみます。

あと、[データ ファイル (自動)]と[データ ファイル ]の違いは、なにか現在調査中です。

2009/01/25 05:56:37

その他の回答1件)

id:tsukasa57 No.1

回答回数110ベストアンサー獲得回数20

ポイント50pt

興味があったのでちょっと調べてみたのですが

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

によると、「SQL Server Compact 3.5 データベースを含んだアプリケーションの ClickOnce 配置に Windows インストーラ テクノロジを使用するには」という節の中で、

[アプリケーション ファイル] をクリックし、.sdf ファイルを [データ ファイル (自動)] に設定します。

これは、.sdf ファイルをローカル データ ファイルとして扱い、データ ディレクトリに格納するようインストーラに伝えるための設定です。

とありますが、これは試されましたか?

私は ClickOnce を扱ったことありますが SQL Server Compact 3.5 は使用したこと無いし、試してもないのですが、参考になりましたら幸いです。

id:kappapa

ご回答ありがとうございます。

[データ ファイル (自動)]を、選んで発行しています。

で、データディレクトリにアプリとは別に格納されるのは確認しています。

なんか思ったとおりの動きをしてくれません(泣)

2009/01/23 00:52:54
id:tsukasa57 No.2

回答回数110ベストアンサー獲得回数20ここでベストアンサー

ポイント50pt

とても気になって調べてみたのですが、*.sdf ではなく、*.txt で実験したところ、

データディレクトリに格納されたファイルは、上書きされませんでした。

私の環境は Visual Studio 2005 + Windows 2000 SP4 ですが...


  1. ClickOnce でアプリケーション(とテキストファイル)を配布
  2. Data ディレクトリに格納された *.txt を直接編集してみた。
  3. アプリケーションを変更して(つまりバージョンアップして)ClickOnce で配布
  4. アプリケーションを実行。

アプリケーションを実行すると、アプリケーションは正常に更新された。

データファイルを確認すると、2) で直接編集した内容が維持されていた。

データファイルは、次のように 2 つのディレクトリに格納される(X,Y,Zの部分は省略)。

C:\Documents and Settings\administrator\Local Settings\Apps\2.0\Data\XXX\YYY\ZZZ01\Data

C:\Documents and Settings\administrator\Local Settings\Apps\2.0\Data\XXX\YYY\ZZZ02\Data

これは、ClickOnce の仕様でバージョンアップする前に戻すことが出来るようにするため。

2) でこのディレクトリに格納されたファイルを編集して、4) でバージョンアップすると

2) で編集したファイルがコピーされる。


...あれ、これって、期待されている動作なのでは...

設定状況のスクリーンショット

http://f.hatena.ne.jp/tsukasa57/20090123023447

http://f.hatena.ne.jp/tsukasa57/20090123023446


できれば「この質問・回答へのコメント」欄でコメントを受け付けるようにして欲しいです。

id:kappapa

同じような感じで確認してみました。

※DBを直接編集ではなくアプリで追加変更しています。

バージョンアップしたときに、直前バージョンのDBファイルはコピーされませんでした。

Ver1.0.0.38での状態

http://f.hatena.ne.jp/kappapa/20090125051146

バージョンアップにて1.0.0.39に

http://f.hatena.ne.jp/kappapa/20090125051144

発行の設定状況

http://f.hatena.ne.jp/kappapa/20090125051145

発行したファイル群

http://f.hatena.ne.jp/kappapa/20090125051143

発行状況に違いがあるようなので、[データ ファイル (自動)]から[データ ファイル ]

へ変更して発行してみたところ、うまくコピーできました。(期待している動作)

ありがとうございました。

以前に、発行の状況を色々変更して試してみたつもりなんですが。

とりあえず、これでしばらく様子をみてみます。

あと、[データ ファイル (自動)]と[データ ファイル ]の違いは、なにか現在調査中です。

2009/01/25 05:56:37
  • id:kappapa
    [データ ファイル (自動)]と[データ ファイル ]の違い...
    今のところ見つけられません。
  • id:tsukasa57
    http://msdn.microsoft.com/ja-jp/library/xtkkwf3d.aspx かな。
    どうも拡張子によって自動的に判断するということみたいです。たぶん、*.sdf は比較的新しく登場した拡張子なのでデータファイルとして判断されていないのではないかと思います。

    とりあえず、うまくいって良かったですね。
  • id:kappapa
    なるほど、そうなんですね。

    勉強になりました。ありがとうございました。
  • id:kappapa
    結局、開発中に少しでもSDFファイルをさわったりすると、新しくなったと見なして、上書きしてしまうようです。
    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47402&forum=7
    ここに同じような悩みを質問されている方がいますが、解決していません。
    しょうがないので、上書き時のために、バックアップをアプリ終了後に取るようにしています。
  • id:tsukasa57
    > 開発中に少しでもSDFファイルをさわったりすると、新しくなったと見なして、上書きしてしまうようです。

    たぶん、これは ClickOnce の仕様だと思います。データファイルの場合は SDF ファイルに限らずファイルが更新されればそれは「新しくなった」と見なすと思います。atmarkit の mdb の事例も mdb を変更するような(テーブル、サイズを変えるなど)ことを行うと「新しくなった」と見なされて更新されています。

    今回、問題が難しくなっているのは、mdb や sdf である点にあると思います。mdb や sdf を開発環境やアクセスで開くとデータを追加、削除などしていないにもかかわらず、更新されてしまう。意図しない更新がおきるのが問題だと思います。

    ClickOnce は mdb や sdf 特有の処理を行っているわけではなく、単純にファイルが更新されているか否かしか判断していないので ClickOnce の動作としてみれば仕様通りだと思います。

    ここまでの内容では、問題の回避にならないので、参考までに意見を書いておくと、手っ取り早いのは、mdb や sdf を読み取り専用にしておくこと。配布先で読み取り専用を解除すれば意図しない更新はさけられます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません