Странные результаты от чтения OdbcDataReader Sqlite DB - PullRequest
1 голос
/ 04 января 2009

Этот метод возвращает некоторые странные результаты, и ему было интересно, не может ли кто-нибудь объяснить, почему это происходит, и, возможно, найти решение для получения желаемых результатов.

Результаты:

FileName = что я ожидал

FileSize = то, что я ожидал

Буфер = все байты = 0

BytesRead = 0

BlobString = строка двоичных данных

FieldType = BLOB (что я ожидал)

ColumnType = System.String

Кроме того, если размер файла превышает несколько килобайт, программа чтения генерирует исключение, заявляя, что аргумент емкости StringBuilder должен быть больше нуля (предположительно, потому что размер больше Int32.MaxValue).

Полагаю, мой вопрос в том, как правильно читать большие BLOB-объекты из OdbcDataReader?

    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;
        }
    }

Ответы [ 2 ]

1 голос
/ 04 января 2009

Я создал поле как BLOB. Однако, увидев результаты вашего предложения о том, что GetFieldType является System.String, я не уверен. Я использую аддон SQLite Manager FireFox для менеджера, и он сообщает content как BLOB.

.NET и менеджер SQLite, похоже, конфликтуют. Я могу правильно сохранить файл из диспетчера, чтобы знать, что он правильно хранится - он просто читает его в моем приложении.

размер файла - это текстовое поле, я просто быстро добавил его, чтобы попытаться отладить все это, и я планирую изменить его рано или поздно.

Проблема с размером действительно удивляет меня, но я не могу ее объяснить (вот почему я здесь :) Я не могу определить, каков точный предел размера, но я знаю, что это приведет к ошибке с файлом это всего 34 КБ. Ниже приводится копия созданного мной отчета об исключении.

Произошла ошибка: 13:36 1/4/2009 HelpLink:

InnerException:

Сообщение:
«емкость» должна быть больше нуля. Наименование параметра: емкость

Источник:
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) в System.Data.Odbc.OdbcDataReader.GetValue (Int32 i) в System.Data.Odbc.OdbcDataReader.get_Item (строковое значение) в AppEx.Data.DatabaseHandler.SaveBinaryFile (ключ строки) в ... \ Data \ DatabaseHandler.cs: строка 249

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

0 голосов
/ 04 января 2009

Является ли тип поля в базе данных определенно BLOB, а не CLOB? Это, конечно, выглядит , как будто он обрабатывает его как текстовые данные вместо двоичных данных. Что возвращает Reader.GetFieldType(2)?

Так же, как побочный вопрос, действительно ли поле filesize действительно строка, а не целое число? Разве вы не можете просто использовать Reader.GetInt32(1)?

Наконец, с вашей проблемой размера - когда вы говорите о чем-то, что «больше, чем несколько КБ» - есть большая разница между «больше, чем несколько К» и «достаточно большим, чтобы переполнить int.MaxValue» (что будет 2 Гб). У вас есть что-нибудь размером в несколько мегабайт?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...