Как хранить и картинки в Db40? - PullRequest
2 голосов
/ 26 июня 2010

Я хочу, чтобы магазины использовали DB4o и проверенный код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Db4objects.Db4o;
using Db4objects.Db4o.Linq;

namespace imagemsDb4o
{

class Person
public class Person
{
    public string Name { set; get; }
    public byte foto { set; get; }
}

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

           private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            FileInfo fi = new FileInfo("c:\\test.yap");
            if (fi.Exists)
                fi.Delete();
            pictureBox1.Load("c:\\sunset.jpg");

            Person pers = new Person();
            pers.Name = "Martin";
            pers.bild = (System.Drawing.Bitmap)(pictureBox1.Image);

            IObjectContainer db = Db4oFactory.OpenFile("c:\\test.yap");
            db.Store(pers);
            db.Commit();
            db.Close();
        }

        private void button2_Click_1(object sender, EventArgs e)
        {
            Person suchpers = new Person();
            suchpers.Name = "Martin";

            IObjectContainer db = Db4oFactory.OpenFile("c:\\test.yap");
            IObjectSet result = db.QueryByExample(suchpers);
            Person gefunden = (Person)result.Next();

            textBox2.Text = (string) gefunden.Name;

            pictureBox2.Image = (byte) gefunden.bild;
            db.Close();
        }

    }
}

Выдает ошибку, когда я нажимаю кнопку2. Какое изменение я должен сделать?

Ответы [ 2 ]

3 голосов
/ 27 июня 2010

Вы пытаетесь сохранить GUI- / Drawing-Object из WindowForms / WPF (System.Drawing.Bitmap-Object). Однако это не работает. Причина в том, что GUI-класс (Winforms, WPF и т. Д.) Часто содержит ссылки на базовую систему рисования, как собственные дескрипторы ресурсов ОС. И они не могут быть правильно сериализованы. В таких случаях вы создаете класс, который представляет изображение. Этот класс содержит представление изображения. Обычно это BLOB-объект, в котором хранится изображение.

Существует два основных способа обработки BLOB-объектов. Либо вы храните большой двоичный объект в виде байтового массива в базе данных, либо используете специальный тип db4o-Blob. Оба имеют свои преимущества.

Преимущества / недостатки с байтовым массивом:

  • BLOB-объекты находятся в файле базы данных db4o. Так что есть только один файл для копирования.
  • Байт-массивы являются частью обычной db4o-транзакции и ведут себя, как и ожидалось.
  • При хранении больших двоичных объектов вы можете столкнуться с ограничением размера базы данных db4o . (256 ГБ)

Преимущества / недостатки с db4o-blob

  • Капли хранятся как обычные файлы вне базы данных. Это сохраняет базу данных маленькой. Кроме того, вы можете получить доступ ко всем сохраненным BLOB-объектам с помощью обычного приложения.
  • Вам всегда нужно копировать каталог blob и базу данных.
  • db4o-blob работает вне транзакции db4o. Это означает, что db4o-blob ведет себя не так, как любой другой хранимый объект (а API немного странный). Однако это позволяет получить блоб db4o, не блокируя текущую транзакцию.

Для вашего случая я бы сохранил массив byte [] с картинкой в ​​классе Person. Или вы создаете специальный Image-класс. Этот класс изображений содержит байтовый массив с изображением. И несколько методов для преобразования этого байтового массива из и в Winforms-bitmap.

1 голос
/ 26 июня 2010

Я думаю, что вы должны преобразовать изображение в байтовый массив, прежде чем присваивать свойству foto, и преобразовать байтовый массив обратно в растровое изображение, прежде чем присваивать свойству imageboxbox

...