由于Oracle課程設(shè)計(jì)中涉及到圖片的處理,測(cè)試了好長(zhǎng)的時(shí)間和查閱了很多的資料,終于把這個(gè)問題解決了,在這和大家分享一下:
一、圖片保存到數(shù)據(jù)庫(kù)
Oracle中一般保存圖片的類型為blob,一般的步驟為:
1,首先把圖片轉(zhuǎn)化為二進(jìn)制(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,把二進(jìn)制保存到Oracle數(shù)據(jù)庫(kù)
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);//存儲(chǔ)過程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;//這個(gè)為圖片的二進(jìn)制形式
//comm.Parameters[2].Direction = ParameterDirection.Output;
comm.ExecuteNonQuery();
conn.Close();
二、讀取Oracle數(shù)據(jù)庫(kù)轉(zhuǎn)化為圖片www.linuxidc.com
步驟:
1、讀出二進(jìn)制
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、轉(zhuǎn)化為圖片
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;
}
涉及到的存儲(chǔ)過程
//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);這塊報(bào)參數(shù)無效
可能的原因:
1,圖片轉(zhuǎn)化為二進(jìn)制是出現(xiàn)問題,導(dǎo)致讀取的二進(jìn)制不能轉(zhuǎn)化為圖片,所以報(bào)參數(shù)無效
2,讀取時(shí)轉(zhuǎn)化出錯(cuò),可能byte長(zhǎng)度不夠,導(dǎo)致不完整,報(bào)參數(shù)無效 本文出自:億恩科技【mszdt.com】
服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|