在线急等!关于在Oracle的blob字段中插入图片文件的问题!

scan_sky6 2006-09-28 01:45:41
ImageConn = new OracleConnection("Data Source= eleassay;UID = system;Password=steering");
ImageConn.Open();

string strTxt = "Xyg_Qms_Logic.Insert_ImageInfo";
ImageComm = new OracleCommand(strTxt,ImageConn);
ImageComm.CommandType = CommandType.StoredProcedure;

ImageComm.Parameters.Add("p_ImageFile",OracleType.VarChar,20);
ImageComm.Parameters["p_ImageFile"].Value = "sky.jpg";
ImageComm.Parameters.Add("p_ImageInfo", OracleType.Blob);
string imageFileLocation = PrintScrn.BaseLogic.RunPath + "\\sky.jpg";

FileInfo fi = new FileInfo(imageFileLocation);
FileStream fs = fi.OpenRead();
byte[] imageData = new byte[fs.Length];
fs.Read(imageData, 0, System.Convert.ToInt32(imageData.Length));
ImageComm.Parameters["p_ImageInfo"].Value = imageData;
fs.Close();

try
{
ImageComm.ExecuteNonQuery();
}
catch (System.Exception error)
{
MessageBox.Show(error.Message);
}
finally
{
ImageComm.Connection.Close();
}

上面的程序我调试过是没有问题的.存储过程如下:
procedure Insert_ImageInfo(p_ImageFile in imageinfo.imagefilename%type,
p_ImageInfo in imageinfo.imagefiledata%type
) as

begin
Insert into imageinfo (IMAGEFILENAME,imagefiledata) values (p_ImageFile,ImageInfo);
end;

表imageinfo中的imagefiledata是blob字段类型.
经过几次测试发现小于10K的图片如.jpg,.ico都可以插入进去;
但是一旦文件大于10K,立马就报错,"ORA01460:转换请求无法实现或不合理!"

请高手帮忙解决大于10K的图片插入问题,一旦得到答案调试成功,马上就结帖发薪,多谢啦.
...全文
210 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
scan_sky6 2006-09-29
  • 打赏
  • 举报
回复
只写过SqlServer2000的事务,感觉类似,多兄弟,我刚收到先看看!
阳光_CQC 2006-09-29
  • 打赏
  • 举报
回复
兄弟我帮你测试好了: 需要使用 OracleLob 类来传值 
public OracleLob CreateTempLob(OracleCommand cmd)
{
//Oracle server syntax to obtain a temporary LOB.
cmd.CommandText = "DECLARE A Blob; " +
"BEGIN " +
"DBMS_LOB.CREATETEMPORARY(A, FALSE); " +
":LOC := A; " +
"END;";

//Bind the LOB as an output parameter.
OracleParameter p = cmd.Parameters.Add("LOC", OracleType.Blob);
p.Direction = ParameterDirection.Output;

//Execute (to receive the output temporary LOB).
cmd.ExecuteNonQuery();

//Return the temporary LOB.
return (OracleLob)p.Value;
}


private void button1_Click(object sender, EventArgs e)
{
//ImageConn = new OracleConnection("Data Source= eleassay;UID = system;Password=steering");
ImageConn.Open();
OracleTransaction OracleTrans = ImageConn.BeginTransaction();//修正Blob型数据一定要使用事务
OracleCommand ImageComm = new OracleCommand("", ImageConn);
ImageComm.Transaction = OracleTrans;
try
{
string strFileName = "";
//ofdOpen.Filter = "*.jpg";
if (ofdOpen.ShowDialog() == DialogResult.OK)
{
strFileName = ofdOpen.FileName;
}
else
{
return;
}
OracleLob tempLob = CreateTempLob(ImageComm);
ImageComm.CommandText = "ImageTestInsert";
ImageComm.CommandType = CommandType.StoredProcedure;
//Current_FileName, Current_MyImage
ImageComm.Parameters.Clear();
ImageComm.Parameters.Add("Current_FileName", OracleType.VarChar, 20);
ImageComm.Parameters["Current_FileName"].Value = "sky.jpg";
ImageComm.Parameters.Add("Current_MyImage", OracleType.Blob);

string imageFileLocation = strFileName;
FileInfo fi = new FileInfo(imageFileLocation);
FileStream fs = fi.OpenRead();
byte[] imageData = new byte[fs.Length];
fs.Read(imageData, 0, System.Convert.ToInt32(imageData.Length));
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(imageData, 0, imageData.Length);
tempLob.EndBatch();

ImageComm.Parameters["Current_MyImage"].Value = tempLob;
fs.Close();
ImageComm.ExecuteNonQuery();
OracleTrans.Commit();
}
catch (System.Exception error)
{
OracleTrans.Rollback();
MessageBox.Show(error.Message);
}
finally
{
ImageComm.Connection.Close();
}
}
}
scan_sky6 2006-09-29
  • 打赏
  • 举报
回复
现在用了个本地读取的方法,可以但是不太适用。
scan_sky6 2006-09-29
  • 打赏
  • 举报
回复
发现长度很大字段要一个类似初始化的过程才能填充值。
scan_sky6 2006-09-29
  • 打赏
  • 举报
回复
OK果然是NO.1,够兄弟!中午睡去了,没有用及时回讯,不好意思。
scan_sky6 2006-09-28
  • 打赏
  • 举报
回复
调试完毕,结果完全一样!没有解决
hsghxm 2006-09-28
  • 打赏
  • 举报
回复
我晕,我上传的是安装包,100多M,10K算毛毛雨啊?
scan_sky6 2006-09-28
  • 打赏
  • 举报
回复
确定所用文件大于10K嘛?
hsghxm 2006-09-28
  • 打赏
  • 举报
回复
private void AppendVersionFile(string versionName,string fileName,string pPath)
{

try
{
OracleCommand pCommand = new OracleCommand(C_APPVERSION,ClsOracleDbService.m_Conn);

OracleParameter pVersionNamePara = new OracleParameter("VERSIONNAME_",OracleType.VarChar);
pVersionNamePara.Direction = ParameterDirection.Input;
pVersionNamePara.Value = versionName;

OracleParameter pFielNamePara = new OracleParameter("FILENAME_",OracleType.VarChar);
pFielNamePara.Direction = ParameterDirection.Input;
pFielNamePara.Value = fileName;


OracleParameter pFileBytePara = new OracleParameter("FILESTREAM_",OracleType.Blob);
pFileBytePara.Direction = ParameterDirection.Input;

OracleParameter pIDPara = new OracleParameter("ID_",OracleType.Int32);
pIDPara.Direction = ParameterDirection.Input;
pIDPara.Value = Convert.ToInt32(m_CurID);

byte[] pFileByte = ReadFile(pPath);
if (pFileByte.Length == 0)
pFileByte = new byte[1];
pFileBytePara.Value = pFileByte;

pCommand.Parameters.Add(pVersionNamePara);
pCommand.Parameters.Add(pFielNamePara);
pCommand.Parameters.Add(pFileBytePara);
pCommand.Parameters.Add(pIDPara);

pCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}

private static byte[] ReadFile(string path)
{
FileStream pFileStream = null;
byte[] pReadByte = new byte[0] ;
try
{
pFileStream = new FileStream(path,FileMode.Open,FileAccess.Read);
BinaryReader r = new BinaryReader(pFileStream);
r.BaseStream.Seek(0,SeekOrigin.Begin); //将文件指针设置到文件开始
pReadByte = r.ReadBytes((int)r.BaseStream.Length);
return pReadByte;
}
catch
{
return pReadByte;
}
finally
{
if (pFileStream!=null)
pFileStream.Close();
}
}
没用存储过程,自己写的一个方法,你把它稍微修改一下,应该没问题,我今天还刚刚上传了新东西上去的

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧