ADO调用ORACLE存储过程保存BLOB字段时只能写入部分数据的问题

steveq2008 2008-03-20 12:50:45
     CAdoRecordSet DstPicSet;
CAdoConnection DstPicConnection;
     //使用数据源 myoracle 连接数据库,使用oracle in orahome92 数据源驱动
if(DstPicConnection.Open("Data Source = myoracle;UID = nlv_guest; PWD=guest;",adModeUnknown) == FALSE)
{
OutputDebugString("连接数据库失败");
return FALSE;
}

CAdoCommand DstCommand;

DstCommand.SetConnection(&DstPicConnection);


// 图片参数1
VARIANT varBLOB;
SAFEARRAYBOUND      rgsabound[1];
SAFEARRAY *psa = NULL;
BYTE* m_pchCurrentFile = new unsigned char[72350];
memset(m_pchCurrentFile,0,72350);

CFile fs_File;
fs_File.Open("C:\\1.jpg",CFile::modeRead);

long lLength = fs_File.GetLength();

if(fs_File.Read((void*)m_pchCurrentFile,lLength) != lLength)
{
AfxMessageBox("读取文件长度错误!"); //测试
return FALSE;
}
else
{
AfxMessageBox("读取文件长度ok");
}
fs_File.Close();

byte* pBuff = m_pchCurrentFile;
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
if(psa == NULL)
{
AfxMessageBox("SafeArrayCreate error");
}

for (long i = 0; i < (long)lLength; i++)
{
if(S_OK == SafeArrayPutElement(psa, &i, pBuff++))
{
continue;
}
}

varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;

DstCommand.Append(DstCommand.CreateParameter("ZJWJ1",adBinary,adParamInput,varBLOB.parray->rgsabound[0].cElements,varBLOB));
SafeArrayDestroy(psa);
delete[] m_pchCurrentFile;

    // 调用 system.pro_eps 存储过程 
    DstCommand.SetCommandText("system.pro_eps");

if(DstCommand.Execute() == FALSE)
{
AfxMessageBox("DstPicTestSet execute error");
}

以上就是这段代码,数据库用的是 oracle9.2 ,每次调用该存储过程可以保存图片到表中的 BLOB 字段,使用TOAD工具导出该字段时,图片打开显示只有上面一小部分,属性显示图片大小每次都是 2,000 字节.我想问下高手是不是我的代码那个地方写错了,限制了写入数据的大小?还是数据库的问题?
...全文
162 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
接分先!
steveq2008 2008-03-21
  • 打赏
  • 举报
回复
使用ODBC数据源 myoracle 连接数据库的,配置数据源时使用 oracle in orahome92 数据源驱动程序的
steveq2008 2008-03-21
  • 打赏
  • 举报
回复
我上网搜索,发现好多网友也问这个问题,我的图片170K,存入后使用 toad 导出时,图片大小只有 2000字节大小,占用空间为 4063 字节,是不是连接数据库的方式限制了写入的大小?
DstPicConnection.Open("Data Source = myoracle;UID = nlv_guest; PWD=guest;",adModeUnknown)


存储过程是 :
(zjwj1 in blob)
as
begin
insert into system.testyd( zjwj1)
values(zjwj1);
end;

blob 类型说是支持2GB数据
蒋晟 2008-03-21
  • 打赏
  • 举报
回复
存储过程的参数大小有问题吧
shakaqrj 2008-03-20
  • 打赏
  • 举报
回复
蒋老大出现在地表——
xkyx_cn 2008-03-20
  • 打赏
  • 举报
回复
mark
蒋晟 2008-03-20
  • 打赏
  • 举报
回复
http://support.microsoft.com/kb/185958
steveq2008 2008-03-20
  • 打赏
  • 举报
回复
蒋老大给的网址是VB程序的,也不是调用存储过程的,那为老大能再给一份?

4,017

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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