如何用c语言实现:文件保存到数据库?

lennovo2008 2009-04-28 11:13:39
在网上搜了一下,多数c#,java .net ,VB的实现 ,请高手给个C语言的实现! 谢谢
...全文
527 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2009-05-11
  • 打赏
  • 举报
回复
请到下面的链接下载详细的Pro C和OCI的教程:
http://download.csdn.net/source/1291150

祝你顺利!
lennovo2008 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lwh_1024 的回复:]
连接数据库

C/C++ codeEXEC SQL BEGIN DECLARE SECTION;
char username[] = "boci";
char passwd[] = "boci";
char server[] = "boci";
EXEC SQL END DECLARE SECTION;

EXEC SQL CONNECT :username IDENTIFIED BY :passwd using :server;



中间对数据库的操作,要定义宿主变量

C/C++ codeEXEC SQL BEGIN DECLARE SECTION;
char name[20+1];
EXEC SQL END DECLARE SECTION;



[/Quote]多谢回帖! 你的好像是如何连接数据库啊,但这我是知道的呀
lennovo2008 2009-05-11
  • 打赏
  • 举报
回复
我知道一点proc,就是c语言中嵌入sql语句,可以用proc PARSE=NONE test.pc 预编译成test.c,然后在 $gcc –o test test.c $ORACLE_HOME/lib/libclntsh.so 生成test可执行程序。数据库连接我也是懂的。laiyh08 ,你给我的代码就是一个函数是吧? 可以直接用吗,参数什么意思,怎么用呢?
lennovo2008 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 pathuang68 的回复:]
请到下面的链接下载详细的Pro C和OCI的教程:
http://download.csdn.net/source/1291150

祝你顺利!
[/Quote]
楼上兄弟,我没有资源分了!!发到我邮箱吧 wsw109@qq.com
nicq2008 2009-05-08
  • 打赏
  • 举报
回复
顶。。。
pathuang68 2009-05-08
  • 打赏
  • 举报
回复
还要看是针对什么数据库的。就Oracle而言比较常用的有两种:pro C和OCI。而且OCI效率更高些
laiyh08 2009-05-08
  • 打赏
  • 举报
回复
这个就是针对Oracle的,如果看不懂,应该是楼主不懂Pro*C,那你要看看Pro*C了。
liliangbao 2009-05-07
  • 打赏
  • 举报
回复
帮顶~~~
lwh_1024 2009-05-07
  • 打赏
  • 举报
回复
连接数据库
EXEC SQL BEGIN DECLARE SECTION;
char username[] = "boci";
char passwd[] = "boci";
char server[] = "boci";
EXEC SQL END DECLARE SECTION;

EXEC SQL CONNECT :username IDENTIFIED BY :passwd using :server;


中间对数据库的操作,要定义宿主变量
EXEC SQL BEGIN DECLARE SECTION;
char name[20+1];
EXEC SQL END DECLARE SECTION;

取值
EXEC SQL SELECT NAME INTO :name FROM TABLE;

这时变量name中存放了表TABLE中字段NAME的值
其他的操作都类似
断开数据库
EXEC SQL commit release;


不过如果LZ没有接触过PROC,建议还是先找资料学习一下。从安装oracle和proc开始吧
lwh_1024 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lennovo2008 的回复:]
多谢楼上的回复!!另外,对于不同的数据库,保存的字段不一样吧?oracle用什么字段啊?我现在要保存到oracle数据库中。
[/Quote]
Pro*c应该就是oracle的
lennovo2008 2009-05-07
  • 打赏
  • 举报
回复
哥们,你写的代码怎么用啊? 能不能详细点?给个说明呢
lennovo2008 2009-05-05
  • 打赏
  • 举报
回复
多谢楼上的回复!!另外,对于不同的数据库,保存的字段不一样吧?oracle用什么字段啊?我现在要保存到oracle数据库中。
laiyh08 2009-04-29
  • 打赏
  • 举报
回复
/**
* url -- url of ua profile;
* ua -- user agent
* prof_content -- content of uaprof xml
* -1=fail; 0=ok
*/
int db_save_uaprofile(const char* i_url, const char* i_ua, const char* i_prof_content, void *p)
{
int iRetFlag = 0;

#undef SQLCA
EXEC SQL INCLUDE sqlca;
sql_context ctx;
ctx = p;
EXEC SQL CONTEXT USE :ctx;

if(((i_url == NULL) && (i_ua == NULL)) || i_prof_content == NULL)
{
warning(0, "db_save_uaprofile-- Parameter((i_url && i_ua) || i_prof_content) is null, return -1.");
return RT_NG;
}

EXEC SQL BEGIN DECLARE SECTION;
char strUrl[200+1];
char strUa[200+1];/*modify by laiyh 2007-03-05 15:40*/
char strProfContent[512*1024+1];

EXEC SQL VAR strUrl IS STRING(200+1);
EXEC SQL VAR strUa IS STRING(200+1);
EXEC SQL VAR strProfContent IS STRING(512*1024+1);
EXEC SQL END DECLARE SECTION;

memset(strUrl, 0, sizeof(strUrl));
memset(strUa, 0, sizeof(strUa));
memset(strProfContent, 0, sizeof(strProfContent));

/********begin********//*add by laiyh 2007-03-05*/
if (i_url == NULL)
{
strncpy(strUrl, i_ua, sizeof(strUrl) - 1);
strncpy(strUa, i_ua, sizeof(strUa) - 1);
}
else if (i_ua == NULL)
{
strncpy(strUrl, i_url, sizeof(strUrl) - 1);
strncpy(strUa, i_url, sizeof(strUa) - 1);
}
else
{
strncpy(strUrl, i_url, sizeof(strUrl) - 1);
strncpy(strUa, i_ua, sizeof(strUa) - 1);
}
/*********end********/
/*strncpy(strUrl, i_url, sizeof(strUrl));*//*delete by laiyh 2007-03-05 15:45*/
strncpy(strProfContent, i_prof_content, sizeof(strProfContent) - 1);

/*save uaprof_tab*/
debug("db_save_uaprofile", 0, "db_save_uaprofile-- Begin to insert data into DB.");
/*EXEC SQL
INSERT INTO uaprof_tab(url, ProfContent)
VALUES(:strUrl, :strProfContent);*/
EXEC SQL ALLOCATE :clob;
EXEC SQL WHENEVER SQLERROR GOTO sqlerr;

/******************begin*****************/
/*
* 在插入记录之前,不管数据库中该记录是否已经存在,先删除,再插入,这样可以对数据进行更新
*/
EXEC SQL DELETE
FROM UAPROF_TAB UT
WHERE UT.URL = :strUrl;
/*******************end******************/

EXEC SQL INSERT INTO uaprof_tab (nms_id, url, ua, ProfContent) VALUES (SEQ_UAPROF.nextval, :strUrl, :strUa, EMPTY_Clob())
RETURNING ProfContent INTO :clob;

filelen = strlen(i_prof_content);
amt = filelen;

if (filelen > MAXBUFLEN)
{
nbytes = MAXBUFLEN;
}
else
{
nbytes = filelen;
}

remainder = filelen - nbytes;

memset(buffer.arr, 0, sizeof(buffer.arr));
strncpy((char*)buffer.arr, i_prof_content, nbytes);
buffer.len = strlen((char*)buffer.arr);
/*memset(buffer, 0, sizeof(buffer));
memcpy(buffer, i_prof_content, nbytes);*/

if (remainder == 0)
{
EXEC SQL LOB WRITE ONE :amt
FROM :buffer INTO :clob AT :offset;
}
else
{
EXEC SQL LOB WRITE FIRST :amt
FROM :buffer INTO :clob AT :offset;

islast = 0;
do
{
if (remainder > MAXBUFLEN)
{
nbytes = MAXBUFLEN;
}
else
{
nbytes = remainder;
islast = 1;
}

memset(buffer.arr, 0, sizeof(buffer.arr));
strncpy((char*)buffer.arr, i_prof_content + (filelen - remainder), nbytes);
buffer.len = strlen((char*)buffer.arr);
/*memset(buffer, 0, sizeof(buffer));
memcpy(buffer, i_prof_content + (filelen - remainder), nbytes);*//*BLOB方式*/

if (islast == 1)
{
EXEC SQL LOB WRITE LAST :amt
FROM :buffer INTO :clob;
}
else
{
EXEC SQL LOB WRITE NEXT :amt
FROM :buffer INTO :clob;
}

remainder -= nbytes;
}while ((islast == 0)&&(remainder > 0));

}

EXEC SQL COMMIT WORK;

debug("db_save_uaprofile", 0, "db_save_uaprofile-- Insert data into DB successful.");

EXEC SQL COMMIT WORK;/*add by laiyh 2007-03-05*/

debug("db_save_uaprofile", 0, "db_save_uaprofile-- Return:%d.", iRetFlag);
return iRetFlag;

sqlerr:
iRetFlag = SqlError(&sqlca, p);
warning(0, "db_save_uaprofile-- SqlError: iRetFlag = %d, return.", iRetFlag);
if (iRetFlag < 0)
{
iRetFlag = RT_NG;
}
else
{
iRetFlag = 0;
}

return iRetFlag;
}

你重点看实现方式,里面可能调用了其他函数,如SqlError(),这个是数据库出错处理的,不影响你理解文件入库。
laiyh08 2009-04-29
  • 打赏
  • 举报
回复
你可以用proc,DB里面设置存文件的字段为CLOB类型,或BLOB类型,BLOB类型适合存二进制类型文件。我==给你个例子,暂时没空整。

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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