none
DataTableのバイナリ保存データの下位互換 RRS feed

  • 質問

  • お世話になります。

    .NET Framework2.0のDataTableにはカスタムのバイナリ用フォーマッタが実装されていると思いますが、これによってバイナリ保存されたファイルは、将来ライブラリがバージョンアップしたものから読み込むことができるようでしょうか?

    BinaryFormatter bf = new BinaryFormatter();
    DataTable dt = new DataTable();

    dt.RemotingFormat = SerializationFormat.Binary;

    using (FileStream fs = File.OpenWrite("c:\\test.backup")) {
     bf.Serialize(fs, dt);
    }

    このような、DataTableのバイナリデータに対する下位互換に関する情報を見つけることができませんでした。

    遠隔マシン上のデータベースのバックアップやリカバリに、この方法が使えるかを模索しています。

    ご存知の方がいらっしゃれば、情報ソースを示していただけると非常に助かります。

    以上、よろしくお願いします。

    2006年8月4日 3:46

すべての返信

  • > .NET Framework2.0のDataTableにはカスタムのバイナリ用フォーマッタが実装されていると思いますが、これによってバイナリ保存されたファイルは、将来ライブラリがバージョンアップしたものから読み込むことができるようでしょうか?

    将来にわたって、DataTableの構造が不変であるとは誰も断言できないと思います。
    それにしたがって、構造が変更されたときに、以前のバージョンのバイナリシリアライズしたデータを読み込めるようになるかどうかも現時点ではわからない、としか言いようがないんじゃないでしょうか。

    > 遠隔マシン上のデータベースのバックアップやリカバリに、この方法が使えるかを模索しています。

    データベース自体の機能をうまく使う方法を考えたほうがよさそうな。。。

    2006年8月4日 4:07
  • ヘルプで「バージョン トレラントなシリアル化」を参照してくださいまし。

    2006年8月4日 4:53
  • どっとねっとふぁんさん、返信ありがとうございます。

    >将来にわたって、DataTableの構造が不変であるとは誰も断言できないと思います。

    DataTableの内部構造が不変だとは思わないのですが、フォーマッタがカスタムならバイナリ形式でも読み込み時の下位互換を維持する可能性があるのではないかと思ったのですが・・・。

    >それにしたがって、構造が変更されたときに、以前のバージョンのバイナリシリアライズしたデータを読み込めるようになるかどうかも現時点ではわからない、としか言いようがないんじゃないでしょうか。

    そうですか・・・、ADOのRecordset.Saveメソッドで可能なバイナリ形式の保存データは、現在のバージョンに至るまで下位互換をとっていたので、今回も同様なのでは、と期待しすぎたようです。

    2006年8月4日 8:02
  • おがわみつきさん、返信ありがとうございます。

    >ヘルプで「バージョン トレラントなシリアル化」を参照してくださいまし。

    その内容は確認済みでした。

    今回の場合、DataTableクラスが相手なので、こいつのカスタムフォーマッタが、今後「バージョン トレラント」をサポートするということを、現時点で表明しているかを知りたかったのです。

    MSが、DataSet や DataTable に、直接バイナリ形式の保存メソッドを用意しなかった(ADO時代にはRecordsetにあったのに・・・)ことから、やはり期待するのは無理があるということなのかもしれません。

    2006年8月4日 8:17
  • すいません、蛇足ですが・・・

    >データベース自体の機能をうまく使う方法を考えたほうがよさそうな。。。

    データベースのバックアップ機能は、保存先がハードディスクの場合、DBが動作しているマシン内に制限されると認識しています。この制限を何とかできるなら本当はそれが一番よいのですが。スレ違いになりそですが、どなたか知ってたら教えてほしいです。

     

     

    2006年8月4日 8:24
  • > データベースのバックアップ機能は、保存先がハードディスクの場合、DBが動作しているマシン内に制限されると認識しています。

    データベースの種類やバージョンによって異なるんじゃないでしょうか。
    商用のバックアップツールでそのような機能を持ったものはないのかな?
    SQL Server 2005だとミラーリングとかできるようになったと思うので、手元のマシンと同期させて手元のマシンだけバックアップとかってできそうな気もします。

    まぁ、データベース毎に機能が異なると思うので、ご自分がお使いのデータベースのベンダーに相談してみるのがよいかと。

     

    2006年8月4日 8:37
  • そんなことはありません。

    SQL Server の実行ユーザが明示的なアカウントで実行されている場合、ファイルサーバなどの共有フォルダにバックアップすることができます。

    SQL Server の実行ユーザが LocalSystem などの場合は、ちょいと強引ですが SQL CLR で偽装して、バックアップ処理やファイルのコピー(ローカルからファイルサーバなどの共有フォルダにコピー)をしてみてはいかがでしょうか?
    試していないのでできるかわかりませんが、理論上できるはずです。
    このときの SQL CLR のアクセス許可レベルは EXTERNAL_ACCESS でいけると思います。

    2006年8月4日 9:05
  • >データベースの種類やバージョンによって異なるんじゃないでしょうか。
    >商用のバックアップツールでそのような機能を持ったものはないのかな?
    >SQL Server 2005だとミラーリングとかできるようになったと思うので、手元のマシンと同期させて手元のマシンだけバックアップとかってできそうな気もします。

    すいません、説明が足りませんでした。

    データベースは、SQL Server で、SQL Server 2000 以降をサポートする必要があるという前提がありました。また、パッケージシステムのため、商用に頼ることもできないという事情があるのです・・・。

    2006年8月4日 9:27
  • >SQL Server の実行ユーザが明示的なアカウントで実行されている場合、ファイルサーバなどの共有フォルダにバックアップすることができます。

    >SQL Server の実行ユーザが LocalSystem などの場合は、ちょいと強引ですが SQL CLR で偽装して、バックアップ処理やファイルのコピー(ローカルからファイルサーバなどの共有フォルダにコピー)をしてみてはいかがでしょうか?
    >試していないのでできるかわかりませんが、理論上できるはずです。
    >このときの SQL CLR のアクセス許可レベルは EXTERNAL_ACCESS でいけると思います。

    いろいろ情報ありがとうございます。

    説明が足りていなくて申し訳ないのですが、パッケージシステムのため、共有フォルダなどの利用はできないのです。また、既存のデータベースを利用することもあり得るため、実行ユーザーをこちらで指定することもできません。可能であれば、遠隔のSQL Server に対して、クライアントサイドAPIだけで、バックアップデータをクライアント側に作成(そして、そのデータからリカバリ)できないかと愚考した次第です。

    配置パターンとしては、サーバープログラムとデータベースのマシンが異なることもあり得るので、その場合には、データベースマシン上に作成されたバックアップデータを取得するための、データベースマシン上のリモート呼び出し可能なプログラム(これはSQL CLRでも可能かも、でも2000では・・・)を用意するぐらいしか思いつきません。

    2006年8月4日 9:45
  • この設計はデータ量が増えたときに破綻しますよ。
    DataTable はメモリに展開しますので、巨大なデータが来たときに一発で OutOfMemory に見舞われると思います。
    互換性を重視するのはパッケージとしては当たり前だとは思いますが、バックアップに関しては SQL Server の機能を使ったほうがいいと思います。
    ファイル形式でよいのであれば、BCP でローカルに落としたほうがいいと思います。
    SQL Server のクライアントツールは必須にはなりますが、ある程度のデータサイズはカバーできます。
    ただし、100GB などのデータとかになったら、BACKUP コマンドを使わないと間に合わないと思いますが。

    2006年8月4日 10:42
  • >この設計はデータ量が増えたときに破綻しますよ。
    >DataTable はメモリに展開しますので、巨大なデータが来たときに一発で OutOfMemory に見舞われると思います。

    仰るとおりでした。

    簡単なテストデータ(100万レコードのテーブル)で試したところ、あっという間に OutOfMemory となりました。DataTableによる永続化は、スパッとあきらめることにします。

    >互換性を重視するのはパッケージとしては当たり前だとは思いますが、バックアップに関しては SQL Server の機能を使ったほうがいいと思います。

    そのようですね。もう少し SQL Server の機能を調べてみて、方策を検討してみます。

    色々と、きめ細かいご指導、ありがとうございました。

    2006年8月4日 12:33