基于.net 的oracleOracle数据库图片保存,byte数据和image数据的转换

来源:互联网 发布:3dmax软件简介 编辑:程序博客网 时间:2024/05/20 01:39

最近需要用Oracle数据库保存图片,于是进行了一下研究。其实不管是文档、图片、还是视频,这些都属于非结构化数据,保存的关键在转换类型,下面进行总结。

    1.在数据库表中建立一个LOB类型的字段,这种类型是专门用来保存图片等非结构化数据的,Oracle和SQL Server等大型数据库都支持这样的类型。
    具体类型可能会有若干种,Oralcle支持BLOB、CLOB、NCLOB、BFILE,BLOB是二进制型大对象,CLOB和NCLOB都是字符型大对象,BFILE只存储文件指针,实际的文件是存储在文件系统中的。一般采用BLOB,它支持最大4G的数据。

    2.在程序中将图片转化成字节数组。例如:
    MemoryStream mstream = new MemoryStream();
    image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg); 
    byte[] imageData = mstream.ToArray(); 

    3.用SQL语句进行操作,方法和普通字段类似,只是在要指定字段内容的时候采用参数,将字节数组通过参数传入。例如:
    CREATE TABLE table(ID NUMBER(3), PHOTO BLOB)
    INSERT INTO table(ID,PHOTO) VALUES('1', :Photo)
    :PHOTO是参数,注意这是在Oracle中的写法,在SQL Server中应该是@PHOTO。

    4.取出图像的时候只要将object强制转化为字节数组,再转化为图像即可。例如:
    MemoryStream mstream = new MemoryStream((byte[])imageData);
    Image image=Image.FromStream(mstream);

    其实对BLOB的操作也可以利用.Net的相关类库,不过我没用过,在此不表。


1.将Image图像文件存入到数据库中

       我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才能存入数据库中.

要这里有关数据的操作略写,我将一些代码段写成方法,方便直接调用.

//根据文件名(完全路径)
public byte[] SetImageToByteArray(string fileName)
    {
        FileStream fs = new FileStream(fileName, FileMode.Open);
        int streamLength = (int)fs.Length;
        byte[] image = new byte[streamLength];
        fs.Read(image, 0, streamLength);
        fs.Close();
        return image;
    }

//另外,在ASP.NET中通过FileUpload控件得到的图像文件可以通过以下方法
public byte[] SetImageToByteArray(FileUpload FileUpload1)
    {
        Stream stream = FileUpload1.PostedFile.InputStream;
        byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];
        stream.Read(photo, 0, FileUpload1.PostedFile.ContentLength);
        stream.Close();
        return photo;
    }

2.从SQL Server数据库读取Image类型的数据,并转换成bytes[]或Image图像文件

//要使用SqlDataReader要加载using System.Data.SqlClient命名空间
//将数据库中的Image类型转换成byte[]
        public byte[] SetImage(SqlDataReader reader)
        {
            return (byte[])reader["Image"];//Image为数据库中存放Image类型字段
        }

//将byte[]转换成Image图像类型
//加载以下命名空间using System.Drawing;/using System.IO;
using System.Data.SqlClient;*/
        public Image SetByteToImage(byte[] mybyte)
        {
           Image image;
             MemoryStream mymemorystream = new MemoryStream(mybyte,0, mybyte.Length);
           image = Image.FromStream(mymemorystream);
           return image; 
        }