打印本文 打印本文 关闭窗口 关闭窗口
Oracle空间数据库的读取与写入
作者:武汉SEO闵涛  文章来源:敏韬网  点击数3470  更新时间:2009/4/22 22:06:16  文章录入:mintao  责任编辑:mintao

这是一个控制台应用程序,包括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]  下一页

打印本文 打印本文 关闭窗口 关闭窗口