我用的代码基本如下:用下面的代码操作小图片(20KB左右,是可以插入DB和获取到的),但如果图片过大(大于50KB时),就不能插入DB了.提示什么类型转换错误啥的.
请高手指点~~
private Byte[] getPhoto()
{ string url = Request.Form["file1"];
Byte[] byte2 = null;
if (!string.IsNullOrEmpty(url))
{
//读取页面图片
FileStream fs = new FileStream(@url, FileMode.Open, FileAccess.Read);//读取D盘c.jpg转换为数据流
byte2 = new byte[fs.Length];
fs.Read(byte2, 0, Convert.ToInt32(fs.Length));
fs.Close();
}
return byte2;
} /// <summary>
/// 数据库插入图片
/// </summary>
/// <param name="photoNumber">图片编号</param>
/// <param name="PhotoImage">图片数据</param>
/// <returns>是否插入成功</returns>
public bool SetPhoto(string photoNumber, byte[] PhotoImage)
{ OracleParameter[] param = new OracleParameter[2];
param[0] = new OracleParameter("p_no",OracleType.Char);
param[0].Value=photoNumber;
param[1] = new OracleParameter("p_image", OracleType.Blob);
param[1].Value = PhotoImage; return DBHelper.ExecuteNonQuery("ACCP.proc_photo",CommandType.StoredProcedure,param)>0;
}
请高手指点~~
private Byte[] getPhoto()
{ string url = Request.Form["file1"];
Byte[] byte2 = null;
if (!string.IsNullOrEmpty(url))
{
//读取页面图片
FileStream fs = new FileStream(@url, FileMode.Open, FileAccess.Read);//读取D盘c.jpg转换为数据流
byte2 = new byte[fs.Length];
fs.Read(byte2, 0, Convert.ToInt32(fs.Length));
fs.Close();
}
return byte2;
} /// <summary>
/// 数据库插入图片
/// </summary>
/// <param name="photoNumber">图片编号</param>
/// <param name="PhotoImage">图片数据</param>
/// <returns>是否插入成功</returns>
public bool SetPhoto(string photoNumber, byte[] PhotoImage)
{ OracleParameter[] param = new OracleParameter[2];
param[0] = new OracleParameter("p_no",OracleType.Char);
param[0].Value=photoNumber;
param[1] = new OracleParameter("p_image", OracleType.Blob);
param[1].Value = PhotoImage; return DBHelper.ExecuteNonQuery("ACCP.proc_photo",CommandType.StoredProcedure,param)>0;
}
我在网上看到,说要把Byte[]转换为Oraclelob类型就可以了,那么这个如何转呢?
(备注:我的DB是Oracle)
我DB中就是BLOB的类型哦,当我的Byte数组容量在20K左右时,是可以存入的.但大于这个数值时,就不能储人了.
//读取页面图片
FileStream fs = new FileStream(@url, FileMode.Open, FileAccess.Read);//读取D盘c.jpg转换为数据流
byte2 = new byte[fs.Length];
fs.Read(byte2, 0, Convert.ToInt32(fs.Length));
fs.Close();
改成下面的试试:
Image img = Image.FromFile(@"c:\test.jpg");
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] myData = ms.ToArray();
不过效果是一样的,只能上传小图片到数据库.大图片还是提示: unimplemented or unreasonable conversion requested
主要办法是,先把Byte[]数组转换到OracleBlob类型的对象.
参考代码如下:
OracleConnection conn = new OracleConnection(
"server=test8172; integrated security=yes;");
conn.Open();OracleTransaction tx = conn.BeginTransaction();OracleCommand cmd = conn.CreateCommand();
cmd.Transaction = tx;
cmd.CommandText =
"declare xx blob; begin dbms_lob.createtemporary(
xx, false, 0); :tempblob := xx; end;";
cmd.Parameters.Add(new OracleParameter("tempblob",
OracleType.Blob)).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
OracleLob tempLob = (OracleLob)cmd.Parameters[0].Value;
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(tempbuff,0,tempbuff.Length);
tempLob.EndBatch();
cmd.Parameters.Clear();
cmd.CommandText = "myTable.myProc";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter(
"ImportDoc", OracleType.Blob)).Value = tempLob;
cmd.ExecuteNonQuery();tx.Commit();