将 C# 的图像对象保存到 Oracle BLOB 字段中

红薯

将 C# 的图像对象保存到 Oracle BLOB 字段中

红薯  发表于 2012-9-22 07:33 1年前,   12回/3085阅, 最后回答: 1年前

开源中国诚邀您参加 Cloud Foundry 中国群英会!(北京、上海、杭州、成都、深圳)

image

本文我想跟大家分享的是如何将 C# 中的一些图像对象保存到 Oracle 中的 BLOB 字段中,这里我们并不想从零开始,而是使用我自己的框架,下面我们开始。

由于Oracle课程设计中涉及到图片的处理,测试了好长的时间和查阅了很多的资料,终于把这个问题解决了,在这和大家分享一下:

一、图片保存到数据库

oracle中一般保存图片的类型为blob,一般的步骤为:

1,首先把图片转化为二进制(byte[])

    FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
                byte[] buffByte = new byte[fs.Length];
                fs.Read(buffByte, 0, Convert.ToInt32(fs.Length));
                fs.Close();

2,把二进制保存到oracle数据库

     string strconn = "data source = oem;user id= exam; password=exam;persist security info=false;";
                OracleConnection conn = new OracleConnection(strconn);
                conn.Open();
                OracleCommand comm = new OracleCommand("addUser", conn);//存储过程adduser
                comm.CommandType = CommandType.StoredProcedure;
                comm.Parameters.Add("i_name", OracleType.VarChar, 50);
                comm.Parameters.Add("i_pic", OracleType.Blob);
                //comm.Parameters.Add("i_result", OracleType.Int32);
                comm.Parameters[0].Value = this.textBox2.Text;
                comm.Parameters[1].Value = buffByte;//这个为图片的二进制形式
                //comm.Parameters[2].Direction = ParameterDirection.Output;
                comm.ExecuteNonQuery();

    conn.Close();

二、读取oracle数据库转化为图片www.linuxidc.com

步骤:

1、读出二进制

 string strconn = "data source = oem;user id= exam; password=exam;persist security info=false;";
            OracleConnection conn = new OracleConnection(strconn);
            conn.Open();
            OracleCommand comm = new OracleCommand("selectUser", conn);
            comm.CommandType = CommandType.StoredProcedure;
            comm.Parameters.Add("flag", OracleType.Int32);
            comm.Parameters.Add("i_name", OracleType.VarChar, 50);
            comm.Parameters.Add("cur_out", OracleType.Cursor);
            comm.Parameters[0].Value = 2;
            comm.Parameters[1].Value = this.comboBox1.SelectedValue.ToString();
            comm.Parameters[2].Direction = ParameterDirection.Output;
            OracleDataAdapter da = new OracleDataAdapter(comm);
            DataSet ds = new DataSet();
            da.Fill(ds);

    conn.close();

2、转化为图片

if (ds.Tables[0].Rows.Count > 0)
            {
                MemoryStream buf = new MemoryStream();
                byte[] blob = (byte[])ds.Tables[0].Rows[0]["pic"];//
                buf.Write(blob, 0, blob.Length);
                Image image = Image.FromStream(buf);
                pictureBox2.Image = image;
            }

涉及到的存储过程

 //create or replace procedure addUser
                //(i_name in U_INFO.NAME%type,
                // i_pic  in u_info.pic%type

                // )
                // is
                // begin
                //   insert into U_INFO(name,pic) values(i_name,i_pic);
                // end adduser;

 

//create or replace procedure selectUser
            //(flag in int,
            // i_name  in u_info.name%type,
            // cur_out  out  sys_refcursor
            // )
            // is
            // begin
            //  if flag=1 then
            //     open cur_out for
            //      select name from U_Info;
            //  end if;
            //  if flag=2 then
            //     open cur_out for
            //      select * from U_Info where name=i_name;
            //  end if;
            // end selectUser;

注:在此遇见的问题

 Image.FromStream(buf);这块报参数无效

可能的原因:

1,图片转化为二进制是出现问题,导致读取的二进制不能转化为图片,所以报参数无效

2,读取时转化出错,可能byte长度不够,导致不完整,报参数无效

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-05/36422.htm

 

1. 首先创建一个空的表:  
1 CREATE TABLE GAMBAR
2 (
3   GAMBAR_BIN BLOB
4 );

 

 

01 using System.Windows;
02 using System.Data.OracleClient;
03 using System.Data;
04 using System;
05   
06 namespace WpfSavePhotoToOracle
07 {
08     /// <summary>
09     /// Interaction logic for Window1.xaml
10     /// </summary>
11     public partial class Window1 : Window
12     {
13         OracleConnection conn;
14         OracleCommand cmd;
15   
16         public Window1()
17         {
18             InitializeComponent();
19         }
20  
21         private void btnSaveToOracle_Click(object sender, RoutedEventArgs e)
22         {
23             try
24             {
25                 conn = new OracleConnection(
26                     "Data Source=localhost;" +
27                     "Persist Security Info=True;" +
28                     "User ID=C07;Password=C07;Unicode=True");
29                 conn.Open();
30  
31                 cmd = new OracleCommand(
32                     "INSERT INTO GAMBAR VALUES(:blobtodb)",
33                     conn);
34                 cmd.CommandType = CommandType.Text;
35   
36                 OracleParameter param = cmd.Parameters.Add("blobtodb",
37                     OracleType.Blob);
38                 param.Direction = ParameterDirection.Input;
39                 param.Value = imgViewer.ImageBinaryData;
40  
41                 cmd.ExecuteNonQuery();
42  
43                 conn.Close();
44                 MessageBox.Show("Image saved");
45             }
46             catch (Exception ex)
47             {
48                 MessageBox.Show("failed to save (" + ex.Message + ")");
49             }
50         }
51     }
52 }

7. 现在可以测试你的项目了,点击 Browse... ,选择一个图片然后点击保存按钮,你将看到一个 “Image Saved” 的消息提示框,这表示成功了。

image 

8. 现在检查你的数据库看看写入的数据。

image 

好了,就这么简单。

下面你可以阅读:从 Oracle BLOB 字段中加载图像并显示到 WPF 图像控件

英文原文OSCHINA原创翻译

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储图片到Oracle: ```c# using Oracle.DataAccess.Client; using System.Drawing; using System.IO; //连接Oracle数据库 string connString = "User Id=<username>;Password=<password>;Data Source=<datasource>"; OracleConnection conn = new OracleConnection(connString); conn.Open(); //将图片转换为字节数组 Image image = Image.FromFile("<imagePath>"); MemoryStream ms = new MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); byte[] imageBytes = ms.ToArray(); //插入图片数据到Oracle string sql = "INSERT INTO <tableName> (image_column) VALUES (:imageParam)"; OracleCommand cmd = new OracleCommand(sql, conn); OracleParameter param = new OracleParameter(":imageParam", OracleDbType.Blob); param.Value = imageBytes; cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); //关闭连接 conn.Close(); ``` 读取OracleBLOB字段的图片并显示到PictureBox: ```c# using Oracle.DataAccess.Client; using System.Drawing; using System.IO; //连接Oracle数据库 string connString = "User Id=<username>;Password=<password>;Data Source=<datasource>"; OracleConnection conn = new OracleConnection(connString); conn.Open(); //查询图片数据 string sql = "SELECT image_column FROM <tableName> WHERE <condition>"; OracleCommand cmd = new OracleCommand(sql, conn); OracleDataReader reader = cmd.ExecuteReader(); if (reader.Read()) { //从查询结果读取图片数据 byte[] imageBytes = (byte[])reader["image_column"]; //将字节数组转换为Image对象 MemoryStream ms = new MemoryStream(imageBytes); Image image = Image.FromStream(ms); //将Image对象显示在PictureBox pictureBox1.Image = image; } //关闭连接 conn.Close(); ``` 其 `<username>`、`<password>`、`<datasource>`、`<tableName>`、`<condition>` 需要根据实际情况进行替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值