这是一个控制台应用程序,包括3个文件。根据Oracle技术网上的一个C程序改写, 作用:用OCI来读取和写入Oracle空间数据。
//---------------------------------------------- // main.cpp : 定义控制台应用程序的入口点。 //---------------------------------------------- #include "WReadAndWriteGeometry.h"
int _tmain(int argc, _TCHAR* argv[]) { WReadAndWriteGeometry wjj("txk", "mlib", "147"); wjj.read_geometries("B562D8C5E4C81D0", "GEOLOC", "MI_PRINX", 1); return 0; }
//---------------------------------------------- // WReadAndWriteGeometry.h //---------------------------------------------- #if(!defined(WReadAndWriteGeometry_H)) #define WReadAndWriteGeometry_H
#pragma comment( lib, "oci.lib" ) #pragma comment( lib, "ociw32.lib" ) #pragma comment( lib, "oraocci9.lib" )
#ifndef OCI_ORACLE #include <oci.h> #include <oci1.h> #endif
/*--------------------------------------------------------------------------- PUBLIC TYPES AND CONSTANTS ---------------------------------------------------------------------------*/ #define ARRAY_SIZE 32 #define TYPE_OWNER "MDSYS" #define SDO_ORDINATE_ARRAY TYPE_OWNER".SDO_ORDINATE_ARRAY" #define SDO_ELEM_INFO_ARRAY TYPE_OWNER".SDO_ELEM_INFO_ARRAY" #define SDO_GEOMETRY TYPE_OWNER".SDO_GEOMETRY"
/*************************************************************************/ /* Type definitions */ /*************************************************************************/ 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;
struct sdo_geometry { OCINumber sdo_gtype; OCINumber sdo_srid; sdo_point_type sdo_point; OCIArray *sdo_elem_info; OCIArray *sdo_ordinates; };
typedef struct sdo_geometry SDO_GEOMETRY_TYPE;
/*** ** Indicator structures for SDO_GEOMETRY_TYPE ***/
struct sdo_point_type_ind { OCIInd _atomic; OCIInd x; OCIInd y; OCIInd z; }; typedef struct sdo_point_type_ind sdo_point_type_ind;
struct SDO_GEOMETRY_ind { OCIInd _atomic; OCIInd sdo_gtype; OCIInd sdo_srid; struct sdo_point_type_ind sdo_point; OCIInd sdo_elem_info; OCIInd sdo_ordinates; }; typedef struct SDO_GEOMETRY_ind SDO_GEOMETRY_ind;
/*************************************************************************/ /* Class definitions */ /*************************************************************************/ class WReadAndWriteGeometry { public: WReadAndWriteGeometry(char *username, char *password,char *connectstring); ~WReadAndWriteGeometry(); void read_geometries (char *table, char *geom_column, char *id_column, int num_dimensions); void write_geometries ();
protected: void checkerr(OCIError *errhp, sword status); void connect(char *username, char *password, char *connectstring); void disconnect(void); OCIType *get_tdo(char *typeName); void process_data(int num_dimensions, char *id_column, int rows_to_process, int *rows_processed);
protected: int sc_ops_geom_null(void); void sc_ops_init_geometry (SDO_GEOMETRY_TYPE *, SDO_GEOMETRY_ind *, int); void sc_ops_get_gtype (void); void sc_ops_get_sdo_point (void); int sc_ops_next_elem (void); ub4 sc_ops_get_element_type (void); void sc_ops_get_type1 (void); void sc_ops_get_type2 (void); void sc_ops_get_type3 (void); void sc_ops_get_type4 (void); void sc_ops_get_type5 (void); ub4 get_interpretation (void); void get_ordinates (int starting_offset, int ending_offset); int get_next_ending_offset (int processing_type_4or5); int get_next_starting_offset (int read_varray);
private: OCIEnv *envhp; /* OCI general handles */ OCIError *errhp;
OCIServer *srvhp; OCISvcCtx *svchp; OCISession *usrhp; OCIStmt *stmthp; OCIDescribe *dschp;
//读GEOMETRY数据时,需要的变量 private: OCINumber global_gid[ARRAY_SIZE]; OCIType *geom_tdo; SDO_GEOMETRY_TYPE *global_geom_obj[ARRAY_SIZE];/* spatial object buffer */ SDO_GEOMETRY_ind *global_geom_ind[ARRAY_SIZE]; /* Object indicator */
//写GEOMETRY数据时,需要的变量 private: OCIType *elem_info_tdo; /* Varrays and the type descriptors */ OCIArray *elem_info; OCIType *ordinates_tdo; OCIArray *ordinates;
private: SDO_GEOMETRY_TYPE *m_geom_obj; SDO_GEOMETRY_ind *m_geom_ind; int global_num_dimensions; int global_elem_index; int global_ending_offset; int global_nelems; int global_nords; int global_first_elem;
}; #endif
//---------------------------------------------- // WReadAndWriteGeometry.cpp //---------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <vector> using namespace std;
#include "WReadAndWriteGeometry.h"
static double test_ordinates[] = { 0, 0, 1, 1 };
/******************************************************************************* ** ** Routine: WReadAndWriteGeometry ** ** Description: 构造函数 ** *******************************************************************************/ WReadAndWriteGeometry::WReadAndWriteGeometry(char *username, char *password,char *connectstring) { dschp = NULL; geom_tdo = NULL; elem_info_tdo = NULL; ordinates_tdo = NULL;
global_ending_offset = -1;
for(int i=0;i<ARRAY_SIZE;i++) { global_geom_obj[i] = NULL; global_geom_ind[i] = NULL; }
connect(username, password, connectstring); }
/******************************************************************************* ** ** Routine: ~WReadAndWriteGeometry ** ** Description: 析构函数 ** *******************************************************************************/ WReadAndWriteGeometry::~WReadAndWriteGeometry() { disconnect(); }
/******************************************************************************* ** ** Routine: checkerr ** ** Description: Error message routine ** *******************************************************************************/ void WReadAndWriteGeometry::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: fpr [1] [2] [3] [4] [5] 下一页 没有相关教程
|