1

このメソッドはいくつかの奇妙な結果を返します。なぜこれが起こっているのか、そしておそらく私の望ましい結果を得るための解決策を誰かが説明できるかどうか疑問に思っていました.

結果:

FileName = 私が期待するもの

FileSize = 私が期待するもの

バッファ = すべてのバイト = 0

BytesRead = 0

BlobString = バイナリ データの文字列

FieldType = BLOB (私が期待するもの)

ColumnType = System.String

さらに、ファイルが数 KB より大きい場合、リーダーは StringBuilder の容量引数が 0 より大きくなければならないことを示す例外をスローします (おそらくサイズが Int32.MaxValue より大きいため)。

私の質問は、OdbcDataReader から大きな BLOB を適切に読み取る方法だと思いますか?

    public static String SaveBinaryFile(String Key)
    {
        try
        {
            Connect();

            OdbcCommand Command = new OdbcCommand("SELECT [_filename_],[_filesize_],[_content_] FROM [_sys_content] WHERE [_key_] = '" + Key + "';", Connection);
            OdbcDataReader Reader = Command.ExecuteReader(CommandBehavior.SequentialAccess);

            if (Reader.HasRows == false)
                return null;

            String FileName = Reader.GetString(0);
            int FileSize = int.Parse(Reader.GetString(1));
            byte[] Buffer = new byte[FileSize];
            long BytesRead = Reader.GetBytes(2, 0, Buffer, 0, FileSize);

            String BlobString = (String)Reader["_content_"];
            String FieldType = Reader.GetDataTypeName(2);
            Type ColumnType = Reader.GetFieldType(2);

            return null;
        }
        catch (Exception ex)
        {
            Tools.ErrorHandler.Catch(ex);
            return null;
        }
    }
4

2 に答える 2

1

フィールドを BLOB として作成しました。ただし、GetFieldType が System.String であるという提案の結果を見て、わかりません。マネージャーに SQLite Manager FireFox アドオンを使用しており、コンテンツを BLOB として報告しています。

.NET と SQLite マネージャーが競合しているようです。マネージャーからファイルを適切に保存できるので、ファイルが適切に保存されていることがわかります-それは私のアプリに読み込まれているだけです。

filesizeはテキスト フィールドです。これは、この全体をデバッグするためにすぐに追加したものであり、遅かれ早かれ変更する予定です。

サイズの問題は私にとって本当に驚くべきことですが、それを説明することはできません (それが私がここにいる理由です :) 正確なサイズ制限が何であるかを判断することはできませんが、 34KB。以下に添付したのは、私が作成した例外レポートのコピーです。

エラーが発生しました: 1:36 PM 1/4/2009 HelpLink:

内部例外:

メッセージ:
'capacity' は 0 より大きくなければなりません。パラメータ名:容量

ソース:
mscorlib

StackTrace:
System.Text.StringBuilder..ctor(文字列値、Int32 startIndex、Int32 長さ、Int32 容量) で System.Text.StringBuilder..ctor(文字列値、Int32 容量) で System.Data.Odbc.OdbcDataReader.internalGetString (Int32 i) System.Data.Odbc.OdbcDataReader.GetValue(Int32 i、TypeMap typemap) で System.Data.Odbc.OdbcDataReader.GetValue(Int32 i) で System.Data.Odbc.OdbcDataReader.get_Item(String 値) でAppEx.Data.DatabaseHandler.SaveBinaryFile(String Key) in ...\Data\DatabaseHandler.cs:line 249

TargetSite:
Void .ctor(System.String, Int32, Int32, Int32)

于 2009-01-04T19:39:41.027 に答える
0

データベースのフィールド タイプは CLOB ではなく BLOB ですか? 確かにバイナリデータではなくテキストデータとして扱っているように見えます。何をReader.GetFieldType(2)返しますか?

副次的な問題として、filesizeフィールドは実際には整数ではなく文字列ですか? そのまま使えませんReader.GetInt32(1)か?

最後に、サイズの問題について-「数KBを超える」ものについて話すとき-「数Kを超える」と「オーバーフローするのに十分な大きさint.MaxValue」(2GBになります)の間には大きな違いがあります。サイズが数メガバイトのものはありますか?

于 2009-01-04T19:02:14.113 に答える