【问题标题】:How to stores and Pictures in Db40?如何在 Db40 中存储和图片?
【发布时间】:2010-06-26 14:43:12
【问题描述】:

我想使用 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();
        }

    }
}

当我单击 button2 时出现错误。 我必须做出什么改变?

【问题讨论】:

    标签: .net db4o


    【解决方案1】:

    您正在尝试存储来自 WindowForms/WPF(System.Drawing.Bitmap-Object)的 GUI-/绘图对象。但是,这不起作用。原因是 GUI 类(Winforms、WPF 等)通常包含对底层绘图系统的引用,例如对 OS 资源的本机句柄。并且那些无法正确序列化。在这种情况下,您创建一个代表图像的类。此类包含图片的表示。通常这是一个存储图像的 Blob。

    two basic ways 来处理 Blob。要么将 blob 作为字节数组存储在数据库中,要么使用特殊的 db4o-Blob-Type。两者各有优势。

    字节数组的优点/缺点:

    • blob 位于 db4o-database-file 中。所以只有一个文件可以复制。
    • 字节数组是正常 db4o 事务的一部分,其行为符合预期。
    • 在存储大型 Blob 时,您可能会遇到 database-size limitation of db4o。 (256 GB)

    db4o-blob 的优点/缺点

    • Blob 作为常规文件存储在数据库之外。这使数据库本身很小。此外,您只需使用常规应用程序即可访问所有存储的 blob。
    • 您始终需要复制 blob 目录和数据库。
    • db4o-blob 在 db4o 事务之外工作。这意味着 db4o-blob 的行为不同于任何其他存储对象(而且 API 有点奇怪)。但是,这允许在不阻塞当前事务的情况下检索 db4o-blob。

    对于您的情况,我将在 Person 类中存储一个带有图片的 byte[] 数组。或者你创建一个特殊的图像类。然后这个图像类包含一个带有图片的字节数组。还有一些方法可以将此字节数组从 Winforms 位图转换为 Winforms 位图。

    【讨论】:

    • pf。让我羡慕 um pqueno 的例子?
    • Gamlor,你能给我发个例子吗?提前谢谢你
    【解决方案2】:

    我认为您应该在分配给 foto 属性之前将图片转换为字节数组,并在分配给图片框的图像属性之前将字节数组转换回位图

    【讨论】:

    • Raj,你能给我发个例子吗?提前谢谢你
    • 你好 Salamao 抱歉刚刚收到你的笔记。我看到 Gamlor 已经回复了您的请求。
    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 2013-03-24
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2011-02-14
    相关资源
    最近更新 更多