如何向oracle 中插入图片

knowxy 2008-12-15 10:12:26
c++ 能用occi 向oracle 字段中插入图片吗?如何实现,请代码,谢谢!
...全文
198 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowxy 2008-12-16
  • 打赏
  • 举报
回复

#include <occi.h>
#include <fstream>
#include <iostream>
using namespace std;
using namespace oracle::occi ;

int main()
{
oracle::occi ::Environment *env=Environment::createEnvironment (Environment ::DEFAULT);
Connection *conn=env->createConnection ("x10n6y","831122","orcl");

Statement *stmt=conn->createStatement ("INSERT INTO electronic_media(product_id,ad_id,ad_composite,ad_sourcetext) VALUES (:v1, :v2, :v3, :v4)");
Blob blob(conn);
blob.setEmpty();
Clob clob(conn);
clob.setEmpty ();
stmt->setInt(1,8888);
stmt->setInt(2,11001);
stmt->setBlob(3,blob);
stmt->setClob(4,clob);
stmt->executeUpdate();
conn->commit();
//conn->terminateStatement (stmt);

string sqlQuery = "SELECT product_id,ad_id,ad_composite FROM electronic_media FOR UPDATE";
stmt->setSQL (sqlQuery);

ResultSet *rs=stmt->executeQuery ();
while(rs->next())
{
Blob blob=rs->getBlob (3);
unsigned int blobLen=blob.length ();
unsigned int offset=1;

char*fileName=(char*)"blobdemo.bmp";
char* bufferR=new char[1024];
memset (bufferR,NULL,1024);
ifstream inFile;
inFile.open (fileName,ios::in);
if (!inFile)
{
delete[]bufferR;
return 1;
}
Stream* strm=blob.getStream ();
while(inFile)
{
memset(bufferR,NULL,1024);
inFile.read (bufferR,1024);
strm->writeBuffer(bufferR,strlen(bufferR));
}
strcpy(bufferR,"This piece for writeLastBuffer");
strm->writeLastBuffer (bufferR,1024);
blob.closeStream (strm);
inFile.close ();
delete[] bufferR;
}
string sqlQuery1 = "SELECT product_id,ad_id,ad_composite FROM electronic_media";
stmt->setSQL(sqlQuery1);
ResultSet *rset2= stmt->executeQuery ();
while (rset2->next ())
{
cout << "Product_id : " << (int)rset2->getInt(1) << endl;
cout << "Ad_id : " << (int)rset2->getInt(2) << endl;
Blob blob = rset2->getBlob (3);
unsigned char *buffer=new unsigned char[1024];
memset(buffer,NULL,1024);
//int bytesRead=blob.read (blobLen,buffer,blobLen,offset);
//for(int i=0;i<bytesRead;i++)
//{
// cout<<(int)buffer[i];
//}
//cout<<endl;

Stream *inStream=blob.getStream (1,0);
int bytesRead=inStream->readBuffer ((char*)buffer,1024);
while(bytesRead>0)
{
for(int i=0;i<bytesRead;i++)
{
cout<<(int)buffer[i];
}
bytesRead=inStream->readBuffer ((char*)buffer,1024);
}
cout<<endl;
delete []buffer;
system("pause");
return 0;
}
}


occi官方的列子,学习了
SearchLife 2008-12-15
  • 打赏
  • 举报
回复
http://louisyoo.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-117630-uid-41414.html
knowxy 2008-12-15
  • 打赏
  • 举报
回复
c++就没有办法将图片插入oracle吗?
knowxy 2008-12-15
  • 打赏
  • 举报
回复
高人,前辈在那里?
Claude 2008-12-15
  • 打赏
  • 举报
回复
only up
knowxy 2008-12-15
  • 打赏
  • 举报
回复
不知道还有没人关注,我修改代码后如下:


#include <string>
#include <cmath>
#include <occi.h>
#include <fstream>
#include <iostream>
using namespace oracle::occi;
using namespace std;
int main(int argc, char* argv[])
{
Environment *env = Environment::createEnvironment();
Connection *conn=env->createConnection("x10n6y","831122","orcl");
Statement *stmt = conn->createStatement("insert into documents values (:1)");
Clob doccontents(conn);
doccontents.setEmpty();
stmt->setClob(1, doccontents);
stmt->executeUpdate();
conn->commit();

stmt = conn->createStatement("select body from documents for update");
ResultSet *rs = stmt->executeQuery();
while(rs->next()==true)
{
Clob doccontents = rs->getClob(1);
}
unsigned char buffer[]={"0100101"};
doccontents.write (sizeof(buffer), buffer, sizeof(buffer), 1);//这里报内存错误
conn->commit();
system("pause");
}


谁知道blob.write()明确用法?我是不是用错了?
knowxy 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 SearchLife 的回复:]
http://louisyoo.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-117630-uid-41414.html
[/Quote]

这个是java实现的吧。

----------------------------------------------------------------
我在occi教程里找到的一段

#include <string>
#include <cmath>
#include <occi.h>
#include <fstream>
using namespace oracle::occi;
int main(int argc, char* argv[])
{
Environment *env = Environment::createEnvironment();
Connection *conn=env->createConnection("xxxxx","xxxxx","xxx");
unsigned char* buf;
std::ifstream f;
f.open ("c:\\11.txt",std::ios_base::binary);
f.seekg (0,std::ios_base ::end);
int len=f.tellg();
f.seekg (0,std::ios_base::beg);
buf=new unsigned char[len];
f.read ((char*)buf,len);
f.clear ();
f.close ();
Statement *stmt = conn->createStatement(" insert into documents values (:1)");
//create empty Clob
Clob doccontents(conn);
doccontents.setEmpty();
//1st insert will create LOB locator in database
stmt->setClob(1, doccontents);
stmt->executeUpdate();
conn->commit();

//now select the Clob again and add contents
stmt = conn->createStatement("select body from documents for update");
ResultSet *rs = stmt->executeQuery();
doccontents =rs->getClob(1); //每次执行到这里就报内存错误
doccontents.write(100, buf, 100, 1);
conn->commit();
}


我是在vs2005下调试的不知道什么原因?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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