在OCI中取object对象内容的问题!

JoySwing 2002-04-10 08:07:43
我用下面的代码取几何对象的内容,编译通过,但执行后发生非法操作
谁能帮我找出错误??

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>
#include <iostream.h>


void checkerr(OCIError *errhp, sword status)
{
text errbuf[512];
sb4 errcode = 0;

switch (status)
{
case OCI_SUCCESS:
break;
case OCI_SUCCESS_WITH_INFO:
fprintf(stderr, "OCI_SUCCESS_WITH_INFO\n");
break;
case OCI_ERROR:
OCIErrorGet((dvoid *)errhp, (ub4)1, (text *)NULL, &errcode,
errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR);
fprintf(stderr, "%.*s\n", 512, errbuf);
break;
case OCI_NEED_DATA:
fprintf(stderr, "OCI_NEED_DATA\n");
break;
case OCI_NO_DATA:
fprintf(stderr, "OCI_NO_DATA\n");
break;
case OCI_INVALID_HANDLE:
fprintf(stderr, "OCI_INVALID_HANDLE\n");
break;
case OCI_STILL_EXECUTING:
fprintf(stderr, "OCI_STILL_EXECUTING\n");
break;
case OCI_CONTINUE:
fprintf(stderr, "OCI_CONTINUE\n");
break;
default:
break;
}
}

struct sdo_point_type
{
OCINumber x;
OCINumber y;
OCINumber z;
};
typedef struct sdo_point_type sdo_point_type;

typedef OCIArray sdo_elem_info_array;
typedef OCIArray sdo_ordinate_array;

typedef struct sdo_geometry
{
OCINumber sdo_gtype;
OCINumber sdo_srid;
sdo_point_type sdo_point;
OCIArray *sdo_elem_info;
OCIArray *sdo_ordinates;
} sdo_geometry;


static OCIEnv *p_env;
static OCIError *p_err;
static OCISvcCtx *p_svc;
static OCIStmt *p_sql;
static OCIDefine *p_dfn = (OCIDefine *) 0;
static OCIDefine *pD1,*pD2;
static OCIBind *p_bnd = (OCIBind *) 0;

void main()
{
int rc;
char errbuf[100];
int errcode;


rc = OCIInitialize((ub4)OCI_OBJECT, (dvoid *)0, /* Initialize OCI */
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *)) 0 );

/* Initialize evironment */
rc = OCIEnvInit( (OCIEnv **) &p_env, OCI_DEFAULT, (size_t) 0, (dvoid **) 0 );

/* Initialize handles */
rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_err, OCI_HTYPE_ERROR,
(size_t) 0, (dvoid **) 0);
rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_svc, OCI_HTYPE_SVCCTX,
(size_t) 0, (dvoid **) 0);

/* Connect to database server */
rc = OCILogon(p_env, p_err, &p_svc, (unsigned char *)"scott", 5, (unsigned char *)"tiger", 5, (unsigned char *)"spadata", 7);
if (rc != 0) {
OCIErrorGet((dvoid *)p_err, (ub4) 1, (text *) NULL, &errcode, (unsigned char *)errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
printf("Error - %.*s\n", 512, errbuf);
exit(8);
}

/* Allocate and prepare SQL statement */
rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_sql,
OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0);
rc = OCIStmtPrepare(p_sql, p_err,(ub1 *) "select gid,shape from spatest",
(ub4) 37, (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);


char *SCHEMA="MDSYS";
OCIType *tdo =(OCIType *) 0;

////////////////////////////////////////

checkerr(p_err,
OCITypeByName(
p_env,
p_err,
p_svc,
( text *)SCHEMA,
(ub4) strlen((char *)SCHEMA),
( text *)"SDO_GEOMETRY",
(ub4) strlen((char *)"SDO_GEOMETRY"),
(CONST text *) 0,
0,
OCI_DURATION_NULL,
OCI_TYPEGET_HEADER,
&tdo));
if(!tdo)
{
printf("NULL tdo returned\n");

}


int gid;
sdo_geometry *p_geo;
p_geo=new sdo_geometry;

checkerr(p_err,OCIDefineByPos(
p_sql,
&pD1,
p_err,
(ub4)1, //第一列
(dvoid *)&gid,
(sb4)sizeof(int),
SQLT_INT,
(dvoid *)0,
(ub2 *)0,
(ub2 *)0,
(ub4)OCI_DEFAULT));



checkerr(p_err,
OCIDefineByPos(
p_sql,
&pD2,
p_err,
(ub4)2, //第2列
(dvoid *)0,
(sb4)0,
SQLT_NTY,
(dvoid *)0,
(ub2 *)0,
(ub2 *)0,
(ub4)OCI_DEFAULT));



checkerr(p_err,
OCIDefineObject(
pD2,
p_err,
tdo,
(dvoid **)&p_geo,
(ub4 *) 0,
(dvoid **) 0,
(ub4 *) 0)
);



/* Execute the SQL statment */
checkerr(p_err,OCIStmtExecute(p_svc, p_sql, p_err, (ub4) 1, (ub4) 0,
(CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT));



while (rc != OCI_NO_DATA) { /* Fetch the remaining data */
printf("%d\n",gid);
rc=OCIStmtFetch(p_sql, p_err, 1, 0, 0);

}

rc = OCILogoff(p_svc, p_err); /* Disconnect */
rc = OCIHandleFree((dvoid *) p_sql, OCI_HTYPE_STMT); /* Free handles */
rc = OCIHandleFree((dvoid *) p_svc, OCI_HTYPE_SVCCTX);
rc = OCIHandleFree((dvoid *) p_err, OCI_HTYPE_ERROR);

return;
}
...全文
104 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
JoySwing 2002-04-11
  • 打赏
  • 举报
回复
tddn! 还是我自己解决拉!!!
当个程序员真辛苦!
JoySwing 2002-04-10
  • 打赏
  • 举报
回复
运行到OCIStmtExecute时出错!

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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