Поместить и восстановить изображение в базе данных SQLite - PullRequest
2 голосов
/ 10 июля 2011

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

Итак, используя rawDoc = File.ReadAllBytes(openFileDialog.FileName);, я получаю байт [] rawDoc некоторого изображения (или другого файла).Тогда

String dbConnection = "Data Source=dbase.s3db";
SQLiteConnection cnn = new SQLiteConnection(dbConnection);
cnn.Open();
String sql = String.Format("INSERT INTO registry" +
            "(NameDoc, YearDoc, MonthDoc, DayDoc, RawDoc) VALUES" +
            "('{0}', '{1}', '{2}', '{3}', '{4}')",
            txtNameDoc.Text, numUDYear.Value, numUDD.Value, numUDD.Value, Convert.ToBase64String(rawDoc));

, если я попытаюсь проверить rawDoc с этим

byte[] imageBytes = Convert.FromBase64String(testRaw);
        MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
        ms.Write(imageBytes, 0, imageBytes.Length);
        pictureBox1.Image = Image.FromStream(ms, true);

Я получу нормальную картинку.Но если я попытаюсь сделать это с данными из базы SQLite с

SQLiteCommand myCommand = new SQLiteCommand(query, cnn);
        SQLiteDataReader myDataReader = myCommand.ExecuteReader();

        string raw = null;
        while (myDataReader.Read())
        {
           raw += myDataReader["RawDoc"].ToString().Trim();

        }

        myDataReader.Close();
byte[] imageBytes = Convert.FromBase64String(raw);
        MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
        ms.Write(imageBytes, 0, imageBytes.Length);

        imageBox imgbox = new imageBox();
        PictureBox picBox = new PictureBox();
        picBox.Image = Image.FromStream(ms, true);
        imgbox.Controls.Add(picBox);
        imgbox.Show();

, я получу ошибку: FormatException.Недопустимые символы в строке Base-64.Почему?

спасибо большое!

1 Ответ

2 голосов
/ 10 июля 2011

Нет необходимости преобразовывать ваш байтовый массив в строку со значением 64. Вы просто в конечном итоге будете использовать больше места в вашей базе данных. Кроме того, тогда вы фактически будете иметь данные TEXT в вашей базе данных sqlite, а не BLOB.

Что вам нужно сделать, это использовать SqliteParameters, например, чтобы вставить свой BLOB, вы можете сделать что-то вроде этого:

SQLiteCommand command = cnn.CreateCommand();
command.CommandText = String.Format("INSERT INTO registry" +
        "(NameDoc, YearDoc, MonthDoc, DayDoc, RawDoc) VALUES" +
        "('{0}', '{1}', '{2}', '{3}', @0)",
        txtNameDoc.Text, numUDYear.Value, numUDD.Value, numUDD.Value);
SQLiteParameter parameter = new Parameter("@0", System.Data.DbType.Binary);
parameter.Value = rawDoc;
command.Parameters.Add(parameter);
command.ExecuteNonQuery();

Когда вы извлекаете BLOB, получите его из SQliteDataReader следующим образом:

byte[] imageBytes = (System.Byte[])myDataReader["RawDoc"];

EDIT

Чтобы ответить на ваш комментарий, я предполагаю, что ваш поток должен быть перемотан. В любом случае, я бы сделал так больше:

    MemoryStream ms = new MemoryStream(imageBytes);
    PictureBox picBox = new PictureBox();
    picBox.Image = Image.FromStream(ms, true);

РЕДАКТИРОВАТЬ 2

Тогда я думаю, что проблема в том, как вы извлекаете данные из вашего DataReader; попробуйте что-то вроде этого:

    string raw = "";
    while (myDataReader.Read())
       raw = (string)myDataReader["RawDoc"];

Вероятно, это все еще не работает, поскольку циклы повторяются по всем извлеченным записям, поэтому вы получите изображение последней извлеченной записи.

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