用C或者C++如何生成类似于ADO生成的xml文件?不用ADO

confucius 2008-05-24 09:55:57
用ADO访问Oracle数据库,可以把数据库中的表生成下面格式的xml文件

我现在的问题是:如何不通过ADO,用C或者C++直接生成这样的文件,因为我的程序要在Linux上运行,需要把Oracle中的表数据
导出下面这样的xml,然后传给客户端使用,有没有现成的C或者C++代码?

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly' rs:updatable='true'>
<s:AttributeType name='ZMLM' rs:number='1' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='ZMLM'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='3' rs:maybenull='false'/>
</s:AttributeType>
<s:AttributeType name='HZZM' rs:number='2' rs:nullable='true' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='HZZM'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='10'/>
</s:AttributeType>
<s:AttributeType name='BJM' rs:number='3' rs:nullable='true' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='BJM'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='1'/>
</s:AttributeType>
<s:AttributeType name='BBRQ' rs:number='4' rs:nullable='true' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='BBRQ'>
<s:datatype dt:type='dateTime' rs:dbtype='timestamp' dt:maxLength='16' rs:scale='0' rs:precision='19' rs:fixedlength='true'/>
</s:AttributeType>
<s:AttributeType name='BBBB' rs:number='5' rs:nullable='true' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='BBBB'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='2'/>
</s:AttributeType>
<s:AttributeType name='QNAME' rs:number='6' rs:nullable='true' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='QNAME'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='16'/>
</s:AttributeType>
<s:AttributeType name='TBSJ' rs:number='7' rs:nullable='true' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='TBSJ'>
<s:datatype dt:type='dateTime' rs:dbtype='timestamp' dt:maxLength='16' rs:scale='0' rs:precision='19' rs:fixedlength='true'/>
</s:AttributeType>
<s:AttributeType name='SXBZZ' rs:number='8' rs:nullable='true' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='SXBZZ'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='3'/>
</s:AttributeType>
<s:AttributeType name='XXBZZ' rs:number='9' rs:nullable='true' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='XXBZZ'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='3'/>
</s:AttributeType>
<s:AttributeType name='DJH' rs:number='10' rs:nullable='true' rs:writeunknown='true' rs:basetable='BZZD' rs:basecolumn='DJH'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='6'/>
</s:AttributeType>
<s:AttributeType name='ROWID' rs:number='11' rs:nullable='true' rs:rowid='true' rs:basetable='BZZD' rs:basecolumn='ROWID'
rs:keycolumn='true' rs:hidden='true' rs:autoincrement='true'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='18' rs:fixedlength='true'/>
</s:AttributeType>
<s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row ZMLM='NNG' HZZM='南昌南' BJM='H' BBRQ='2003-07-28T00:00:00' BBBB='白' QNAME='YCFJQ' TBSJ='2003-07-25T00:00:00'
ROWID='AAABFiAADAAAA5DAAA'/>
</rs:data>
</xml>

...全文
75 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
confucius 2008-05-26
  • 打赏
  • 举报
回复
up
Waiting4you 2008-05-24
  • 打赏
  • 举报
回复
貌似楼主要的是linux下的xml生成代码,可以去看看开源的XML库。如tinyxml,xerces等
CathySun118 2008-05-24
  • 打赏
  • 举报
回复
OCI

#include "stdafx.h"
#include "stdlib.h"
#include "ocidfn.h"
#include "ocidem.h"
#include "oratypes.h"
#include "ocidem.h"
#include "ociapr.h"
#include "ocikpr.h"
#include "oci.h"
#include <string.h>
#include <conio.h>
char USER[31];
char PASS_WORD[31];
char SERVERNAME[31];

void error_proc(dvoid *errhp, sword status)
{
text errbuf[512];
sb4 errcode;
switch (status)
{
case OCI_SUCCESS:
printf("OCI_SUCCESS\n");
break;
case OCI_SUCCESS_WITH_INFO:
printf("OCI error: OCI_SUCCESS_WITH_INFO\n");
break;
case OCI_NEED_DATA:
printf("OCI error: OCI_NEED_DATA\n");
break;
case OCI_NO_DATA:
printf("OCI error: OCI_NO_DATA\n");
break;
case OCI_ERROR:
(void)OCIErrorGet((dvoid *)errhp,(ub4)1,NULL,&errcode,
errbuf,(ub4)sizeof(errbuf),OCI_HTYPE_ERROR);
printf("错误号:%d\n错误信息:%s\n",errcode,errbuf);
break;
case OCI_INVALID_HANDLE:
printf("OCI error: OCI_INVALID_HANDLE\n");
break;
case OCI_STILL_EXECUTING:
printf("OCI error: OCI_STILL_EXECUTING\n");
break;
default:
break;
}

}

void main ()
{
OCIEnv *envhp = NULL; //环境句柄
OCIError *errhp = NULL; //错误句柄
OCIServer *srvhp = NULL; //服务器句柄
OCISvcCtx *svchp = NULL; //服务环境句柄
OCIStmt *stmthp = NULL; //语句句柄
OCIBind *bnd1p = (OCIBind *)0; //结合句柄
OCIDefine *defhp[5]; //定义句柄
sword status;
int sum; //命中记录数
char* SqlStat = "select * from emp ";
int li_ret;

li_ret = 0;
strcpy(USER,"scott");
strcpy(PASS_WORD,"tiger");
strcpy(SERVERNAME,"itanynj");

// char *SUMMARY_ELEMENT=" rec_ctrl_id,title,first_author,book_search_no,publisher";

//创建环境句柄
OCIEnvCreate(&envhp,OCI_DEFAULT,(dvoid *)0,
0,0,0,0,(dvoid **)0);
//申请错误句柄
OCIHandleAlloc((dvoid *) envhp,(dvoid **)&errhp,
OCI_HTYPE_ERROR,(size_t)0,(dvoid **)0);
//申请服务器句柄
error_proc(errhp,OCIHandleAlloc((dvoid *)envhp,(dvoid **)&srvhp,
OCI_HTYPE_SERVER,(size_t)0,(dvoid **)0));
//申请服务环境句柄
error_proc(errhp,OCIHandleAlloc((dvoid *)envhp,(dvoid **)&svchp,
OCI_HTYPE_SVCCTX,(size_t)0,(dvoid **)0));
//设置服务环境的服务器属性
error_proc(errhp,OCIAttrSet((dvoid *)svchp,OCI_HTYPE_SVCCTX,
(dvoid *)srvhp,(ub4)0,OCI_ATTR_SERVER,(OCIError *)errhp));
//连接数据库,建立会话
status = OCILogon(envhp,errhp,&svchp,reinterpret_cast<unsigned char *>(USER),(ub4)strlen((char *)USER),
(text *)PASS_WORD,(ub4)strlen((char *)PASS_WORD),(text *)SERVERNAME,(ub4)strlen((char *)SERVERNAME));

if (status==OCI_SUCCESS)
printf("成功连接itanynj数据库,已为%s用户建立会话.\n",USER);
else {
printf("连接失败connect fail!\n");
printf("-----ORA_search,ERROR in OCILogon-----\n");
error_proc(errhp,status);
return;
}
//申请语句句柄
error_proc(errhp,OCIHandleAlloc((dvoid *)envhp,(dvoid **)&stmthp,
OCI_HTYPE_STMT,(size_t)0,(dvoid **)0));

//准备SQL语句
error_proc(errhp,OCIStmtPrepare(stmthp,errhp,reinterpret_cast<unsigned char *>(SqlStat),
(ub4)strlen((char *) SqlStat),OCI_NTV_SYNTAX,OCI_DEFAULT));

//-------定义输出变量
error_proc(errhp, OCIDefineByPos(stmthp,&defhp[0],errhp,1,&sum,
sizeof(sum),SQLT_INT,(sb2 *)0,0,(ub2 *)0,OCI_DEFAULT) );


//执行SQL语句
if ((status=OCIStmtExecute(svchp,stmthp,errhp,(ub4)0,
(ub4)0,(CONST OCISnapshot *)NULL, (OCISnapshot *)NULL,
OCI_DEFAULT))
&& status != OCI_SUCCESS_WITH_INFO)
{ //失败则退出
error_proc(errhp,status);
printf("-----ORA_search,ERROR in OCIStmtExecute-----\n");
return;
}
//getch();

error_proc(errhp,OCIStmtFetch(stmthp,errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT));

printf("The sum is %d\n",sum);
//断开连接
error_proc(errhp,OCILogoff(svchp,errhp));
return ;
}

-------------------------------
程序已经调试好!
我用的测试查询是:user:scott/tiger
select * from emp;

我不明白你准备的变量sum 怎么用?
我的运行结果是,sum竟然取了emp 表的第一行数据的第一字段empno的值:7639!

运行时,不要忘了将oci.lib 和oci.dll 考到工程的当前目录,然后再隐式连接oci.dll

就一切ok了!
运行结果为:
----------------------------
OCI_SUCCESS
OCI_SUCCESS
OCI_SUCCESS
成功连接itanynj数据库,已为scott用户建立会话.
OCI_SUCCESS
OCI_SUCCESS
OCI_SUCCESS
OCI_SUCCESS
The sum is 7369
OCI_SUCCESS
Press any key to continue
--------------------------------

4,011

社区成员

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

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