会员
周边
众包
新闻
博问
闪存
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
bielidefeng
博客园
首页
新随笔
联系
订阅
管理
ocidefinearrayofstruct
www.pudn.com
>
TestMutiRead.rar
> h_oracle.cpp, change:2007-09-01,size:24917b
//---------------------------------------------------------------------------
#include "vcl_stl.h"
#pragma hdrstop
/*#include "h_base.h"
#include "h_xml.h"
#include "h_tea.h"
#include "h_global.h"
using namespace h_base;
using namespace h_xml;
using namespace h_tea;*/
#include "h_oracle.h"
//#include "CppSQLite3.h"
//---------------------------------------------------------------------------
set<AnsiString> HOracle::BlackList;
//Add by Liaoyangbo
//增加大对象类型列表
set<AnsiString> HOracle::BlobList;
//End by Liaoyangbo
//Add by Liaoyangbo
void
__fastcall HOracle::prepareBlob(
void
)
{
static
char
*BlobMeta[] =
{
"BLOB"
,
"CLOB"
,
"NCLOB"
,
"BFILE"
,
NULL
};
for
(
int
i = 0; BlobMeta[i] != NULL; i++)
{
BlobList.insert(BlobMeta[i]);
}
}
//End by Liaoyangbo
void
__fastcall HOracle::Prepare(
void
)
{
static
char
*SpecialSchemas[] =
{
"ANONYMOUS"
,
"CTXSYS"
,
"DBSNMP"
,
"DMSYS"
,
"OCITEST"
,
"ODM"
,
"ODM_MTR"
,
"OE"
,
"OLAPSYS"
,
"ORDPLUGINS"
,
"ORDSYS"
,
"OUTLN"
,
"PM"
,
"QS"
,
"QS_ADM"
,
"QS_CB"
,
"QS_CBADM"
,
"QS_CS"
,
"QS_ES"
,
"QS_OS"
,
"QS_WS"
,
"RMAN"
,
"SYS"
,
"SYSTEM"
,
"SYSMAN"
,
"WKPROXY"
,
"WK_TEST"
,
"WKSYS"
,
"WMSYS"
,
"XDB"
,
NULL
};
for
(
int
i = 0; SpecialSchemas[i] != NULL; i++ )
BlackList.insert(SpecialSchemas[i]);
}
bool
__fastcall HOracle::SchemaInBlackList(
const
AnsiString &Schema)
{
return
BlackList.find(Schema) != BlackList.end();
}
bool
__fastcall HOracle::Init(
void
)
{
Prepare();
sword r;
//r = OCIEnvCreate(&FEnvhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
r = OCIEnvCreate(&FEnvhp, OCI_THREADED, NULL, NULL, NULL, NULL, 0, NULL);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
return
false
;
FInitOk =
true
;
return
true
;
}
__fastcall HOracle::HOracle(
void
)
{
FErrhp = (OCIError *)OCI_INVALID_HANDLE;
FSrvhp = (OCIServer *)OCI_INVALID_HANDLE;
FSvchp = (OCISvcCtx *)OCI_INVALID_HANDLE;
FSsnhp = (OCISession *)OCI_INVALID_HANDLE;
FConnected =
false
;
Init();
}
__fastcall HOracle::~HOracle(
void
)
{
Disconnect();
FreeHandles();
}
bool
__fastcall HOracle::AllocateHandles(
void
)
{
sword r;
dvoid *tmp;
//r = OCIHandleAlloc(FEnvhp, (dvoid**)&FErrhp, OCI_HTYPE_ERROR, 0, NULL);
r = OCIHandleAlloc(FEnvhp, (dvoid**)&FErrhp, OCI_HTYPE_ERROR, 52, (dvoid **)&tmp);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
//ShowMessage("new gpm. Return:" + IntToStr(r));
CreateErrorString(
"OCIHandleAlloc(Env) : "
,
false
);
//if( MessageDlg("error, return" + IntToStr(r) + ", Continue?",
// mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0) != mrYes )
goto
error;
}
//r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSrvhp, OCI_HTYPE_SERVER, 0, NULL);
r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSrvhp, OCI_HTYPE_SERVER, 52, (dvoid **)&tmp);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIHandleAlloc(Server) : "
);
goto
error;
}
//r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSvchp, OCI_HTYPE_SVCCTX, 0, NULL);
r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSvchp, OCI_HTYPE_SVCCTX, 52, (dvoid **)&tmp);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIHandleAlloc(Svcctx) : "
);
goto
error;
}
//r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSsnhp, OCI_HTYPE_SESSION, 0, NULL);
r = OCIHandleAlloc(FEnvhp, (dvoid**)&FSsnhp, OCI_HTYPE_SESSION, 0, (dvoid**)0);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIHandleAlloc(Session) : "
);
goto
error;
}
//OCI_HTYPE_TRANS
/*
r = OCIHandleAlloc((dvoid *)FEnvhp, (dvoid **)&FTxnhp, OCI_HTYPE_TRANS, 0, 0);
if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString("OCIHandleAlloc(OCITrans) : ");
goto error;
}
*/
return
true
;
error :
FreeHandles();
return
false
;
}
void
__fastcall HOracle::FreeHandles(
void
)
{
if
( FErrhp != (OCIError *)OCI_INVALID_HANDLE )
OCIHandleFree(FErrhp, OCI_HTYPE_ERROR);
if
( FSrvhp != (OCIServer *)OCI_INVALID_HANDLE )
OCIHandleFree(FSrvhp, OCI_HTYPE_SERVER);
if
( FSvchp != (OCISvcCtx *)OCI_INVALID_HANDLE )
OCIHandleFree(FSvchp, OCI_HTYPE_SVCCTX);
if
( FSsnhp != (OCISession *)OCI_INVALID_HANDLE )
OCIHandleFree(FSvchp, OCI_HTYPE_SESSION);
// free OCI_HTYPE_TRANS
/*
if( FTxnhp != (OCITrans *)OCI_INVALID_HANDLE )
OCIHandleFree(FTxnhp, OCI_HTYPE_TRANS);
*/
if
( FEnvhp != (OCIEnv *)OCI_INVALID_HANDLE )
OCIHandleFree(FEnvhp, OCI_HTYPE_ENV);
FErrhp = (OCIError *)OCI_INVALID_HANDLE;
FSrvhp = (OCIServer *)OCI_INVALID_HANDLE;
FSvchp = (OCISvcCtx *)OCI_INVALID_HANDLE;
FSsnhp = (OCISession *)OCI_INVALID_HANDLE;
//OCITrans
//FTxnhp = (OCITrans *)OCI_INVALID_HANDLE;
FEnvhp = (OCIEnv *)OCI_INVALID_HANDLE;
}
int
__fastcall HOracle::CreateErrorString(
const
AnsiString &Text,
bool
Env)
{
text errbuf[512];
sb4 errcode;
errbuf[0] =
'\0'
;
if
( Env )
OCIErrorGet(FEnvhp, 1, NULL, &errcode, errbuf,
sizeof
(errbuf), OCI_HTYPE_ENV);
else
OCIErrorGet(FErrhp, 1, NULL, &errcode, errbuf,
sizeof
(errbuf), OCI_HTYPE_ERROR);
FErrorString = Text +
":"
+ IntToStr(errcode) +
": "
+ AnsiString((
char
*)errbuf,
sizeof
(errbuf)).TrimRight();
if
(Env)
{
if
(FEnvhp == NULL)
{
FErrorString +=
". And Env is NULL!!"
;
// ShowMessage(FErrorString);
}
}
return
errcode;
}
bool
__fastcall HOracle::Connect(
const
AnsiString &DatabaseName,
const
AnsiString &UserId,
const
AnsiString &Password,
bool
Sysdba)
{
sword r;
if
( !AllocateHandles() )
return
false
;
r = OCIServerAttach(FSrvhp, FErrhp, DatabaseName.c_str(),
DatabaseName.Length(), OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIServerAttach : "
);
FreeHandles();
return
false
;
}
r = OCIAttrSet(FSvchp, OCI_HTYPE_SVCCTX, FSrvhp,
0, OCI_ATTR_SERVER, FErrhp);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIAttrSet(SERVER) : "
);
OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);
FreeHandles();
return
false
;
}
/* set the external name and internal name in server handle */
r = OCIAttrSet((dvoid *)FSrvhp, OCI_HTYPE_SERVER, (dvoid *)
"demo"
, 0,
OCI_ATTR_EXTERNAL_NAME, FErrhp);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIAttrSet(SERVER) : "
);
OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);
FreeHandles();
return
false
;
}
r = OCIAttrSet((dvoid *)FSrvhp, OCI_HTYPE_SERVER, (dvoid *)
"txn demo"
, 0,
OCI_ATTR_INTERNAL_NAME, FErrhp);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIAttrSet(SERVER) : "
);
OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);
FreeHandles();
return
false
;
}
r = OCIAttrSet(FSsnhp, OCI_HTYPE_SESSION,
UserId.c_str(), UserId.Length(), OCI_ATTR_USERNAME, FErrhp);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIAttrSet(USERNAME) : "
);
OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);
FreeHandles();
return
false
;
}
r = OCIAttrSet(FSsnhp, OCI_HTYPE_SESSION,
Password.c_str(), Password.Length(), OCI_ATTR_PASSWORD, FErrhp);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIAttrSet(USERNAME) : "
);
OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);
FreeHandles();
return
false
;
}
r = OCISessionBegin(FSvchp, FErrhp, FSsnhp, OCI_CRED_RDBMS,
Sysdba ? OCI_SYSDBA : OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCISessionBegin : "
);
OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);
FreeHandles();
return
false
;
}
r = OCIAttrSet(FSvchp, OCI_HTYPE_SVCCTX,
FSsnhp, 0, OCI_ATTR_SESSION, FErrhp);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIAttrSet(SESSION) : "
);
OCISessionEnd(FSvchp, FErrhp, FSsnhp, OCI_DEFAULT);
OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);
FreeHandles();
return
false
;
}
//OCI_ATTR_TRANS
/*
r = OCIAttrSet(FSvchp, OCI_HTYPE_SVCCTX, FTxnhp, 0, OCI_ATTR_TRANS, FErrhp);
if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString("OCIAttrSet(TRANS) : ");
OCISessionEnd(FSvchp, FErrhp, FSsnhp, OCI_DEFAULT);
OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);
FreeHandles();
return false;
}
*/
/*
for( int i = 0; i <Dbs.size(); i++ )
{
if( Dbs[i].DSN == DatabaseName && Dbs[i].DbStatus != dbsNull)
{
DbIndex = i;
break;
}
}
*/
FConnected =
true
;
return
true
;
}
void
__fastcall HOracle::Disconnect(
void
)
{
if
( !FConnected )
return
;
OCISessionEnd(FSvchp, FErrhp, FSsnhp, OCI_DEFAULT);
OCIServerDetach(FSrvhp, FErrhp, OCI_DEFAULT);
FConnected =
false
;
}
bool
__fastcall HOracle::GetTableInfoList(vector <TableDes> &TableList, AnsiString DBName)
{
int
i=1;
sword r;
OCIStmt *Stmthp1 = (OCIStmt*)OCI_INVALID_HANDLE;
char
Owner[30 + 1];
char
TableName[30 + 1];
char
TableSpace[30 + 1];
char
RowNumber[10 + 1];
//char TableType[12 + 1];
OCIDefine *Defnp;
//char* TableInfoName = (AnsiString(DBName + "_TableInfo")).c_str();
//char* ColumnInfoName = AnsiString(DBName + "_ColumnInfo").c_str();
AnsiString SqlStr1 = AnsiString(
"select owner, table_name, NVL(tablespace_name,chr(0)),"
)
+
" NVL(num_rows,0) from dba_all_tables "
+
" where owner NOT IN ('SYS', 'SYSTEM') order by owner, table_name"
;
TableList.clear();
r = OCIHandleAlloc(FEnvhp, (dvoid**)&Stmthp1, OCI_HTYPE_STMT, 0, NULL);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIHandleAlloc(Stmt1) : "
);
goto
error;
}
r = OCIStmtPrepare(Stmthp1, FErrhp, SqlStr1.c_str(),
SqlStr1.Length(), OCI_NTV_SYNTAX, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIStmtPrepare(SqlStr1) : "
);
goto
error;
}
Defnp = NULL;
r = OCIDefineByPos(Stmthp1, &Defnp, FErrhp, 1, Owner,
sizeof
(Owner) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
goto
error;
}
Defnp = NULL;
r = OCIDefineByPos(Stmthp1, &Defnp, FErrhp, 2, TableName,
sizeof
(TableName) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
goto
error;
}
Defnp = NULL;
r = OCIDefineByPos(Stmthp1, &Defnp, FErrhp, 3, TableSpace,
sizeof
(TableSpace) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
goto
error;
}
Defnp = NULL;
r = OCIDefineByPos(Stmthp1, &Defnp, FErrhp, 4, RowNumber,
sizeof
(RowNumber) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
goto
error;
}
r = OCIStmtExecute(FSvchp, Stmthp1, FErrhp, 0, 0,
NULL, NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIStmtExecute(Stmthp1) : "
);
goto
error;
}
for
(;;)
{
r = OCIStmtFetch2(Stmthp1, FErrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
if
( r == OCI_NO_DATA )
break
;
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIStmtFetch2 : "
);
goto
error;
}
Owner[30] =
'\0'
;
TableName[30] =
'\0'
;
TableSpace[30]=
'\0'
;
//TableType[12] = '\0';
RowNumber[10] =
'\0'
;
TableDes aTable;
aTable.TableOwner = AnsiString(Owner).TrimRight();
aTable.TableName = AnsiString(TableName).TrimRight();
aTable.TableSpace = AnsiString(TableSpace).TrimRight();
aTable.Rows = StrToInt(AnsiString(RowNumber).TrimRight());
aTable.GetColOk =
"no"
;
aTable.GetIndexOk =
false
;
aTable.GetKeyOk =
false
;
//aTable.Type = AnsiString(TableType).TrimRight();
//add 2007-05-24
//GetTableCol(aTable,aTable.Fields,i,DBName);
i++;
TableList.push_back(aTable);
}
OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);
return
true
;
error :
if
( Stmthp1 != (OCIStmt*)OCI_INVALID_HANDLE )
OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);
return
false
;
}
bool
__fastcall HOracle::GetTableCol(AnsiString tableName, AnsiString tableOwner,
vector <ColumnDes> &TableCols)
{
int
i;
sword r;
OCIStmt *Stmthp1 = (OCIStmt*)OCI_INVALID_HANDLE;
/*
char ColumnName[30 + 1];
memset(ColumnName, 0, sizeof(ColumnName));
char DataType[30+1];
char DataLength[10+1];
char DataPrecision[10+1];
char DataScale[10+1];
char Nullable[1+1];
char colID[10 + 1];
*/
typedef
struct
{
char
ColumnName[30 + 1];
//memset(ColumnName, 0, sizeof(ColumnName));
char
DataType[30+1];
char
DataLength[10+1];
char
DataPrecision[10+1];
char
DataScale[10+1];
char
Nullable[1+1];
char
colID[10 + 1];
} t_std;
t_std tstd[100] = {0};
//Add by Liaoyangbo
bool
isLob =
false
;
//增加LONG类型字段的判断
bool
isLong =
false
;
//End by Liaoyangbo
OCIDefine *Defnp;
AnsiString SqlStr1 =
AnsiString(
"select column_name, substr(data_type,0,30), data_length, NVL(data_precision,0),"
)
+
" NVL(data_scale,0), nullable, column_id from dba_tab_columns where table_name='"
+ tableName +
"' and owner ='"
+ tableOwner +
"'"
;
TableCols.clear();
r = OCIHandleAlloc(FEnvhp, (dvoid**)&Stmthp1, OCI_HTYPE_STMT, 0, NULL);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIHandleAlloc(Stmt1) : "
);
//goto error;
}
r = OCIStmtPrepare(Stmthp1, FErrhp, SqlStr1.c_str(),
SqlStr1.Length(), OCI_NTV_SYNTAX, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIStmtPrepare(SqlStr1) : "
);
//goto error;
}
OCIDefine *Defnp1 = (OCIDefine *) NULL;
r = OCIDefineByPos(Stmthp1, &Defnp1, FErrhp, 1, &tstd[0].ColumnName,
sizeof
(tstd[0].ColumnName) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
//goto error;
}
OCIDefine *Defnp2 = (OCIDefine *) NULL;
r = OCIDefineByPos(Stmthp1, &Defnp2, FErrhp, 2, &tstd[0].DataType,
sizeof
(tstd[0].DataType) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
//goto error;
}
OCIDefine *Defnp3 = (OCIDefine *) NULL;
r = OCIDefineByPos(Stmthp1, &Defnp3, FErrhp, 3, &tstd[0].DataLength,
sizeof
(tstd[0].DataLength) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
//goto error;
}
OCIDefine *Defnp4 = (OCIDefine *) NULL;
r = OCIDefineByPos(Stmthp1, &Defnp4, FErrhp, 4, &tstd[0].DataPrecision,
sizeof
(tstd[0].DataPrecision) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
//goto error;
}
OCIDefine *Defnp5 = (OCIDefine *) NULL;
r = OCIDefineByPos(Stmthp1, &Defnp5, FErrhp, 5, &tstd[0].DataScale,
sizeof
(tstd[0].DataScale) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
//goto error;
}
OCIDefine *Defnp6 = (OCIDefine *) NULL;
r = OCIDefineByPos(Stmthp1, &Defnp6, FErrhp, 6, &tstd[0].Nullable,
sizeof
(tstd[0].Nullable) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
//goto error;
}
OCIDefine *Defnp7 = (OCIDefine *) NULL;
r = OCIDefineByPos(Stmthp1, &Defnp7, FErrhp, 7, &tstd[0].colID,
sizeof
(tstd[0].colID) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
//goto error;
}
r = OCIDefineArrayOfStruct(Defnp1, FErrhp,
sizeof
(t_std), 0, 0, 0);
r = OCIDefineArrayOfStruct(Defnp2, FErrhp,
sizeof
(t_std), 0, 0, 0);
r = OCIDefineArrayOfStruct(Defnp3, FErrhp,
sizeof
(t_std), 0, 0, 0);
r = OCIDefineArrayOfStruct(Defnp4, FErrhp,
sizeof
(t_std), 0, 0, 0);
r = OCIDefineArrayOfStruct(Defnp5, FErrhp,
sizeof
(t_std), 0, 0, 0);
r = OCIDefineArrayOfStruct(Defnp6, FErrhp,
sizeof
(t_std), 0, 0, 0);
r = OCIDefineArrayOfStruct(Defnp7, FErrhp,
sizeof
(t_std), 0, 0, 0);
r = OCIStmtExecute(FSvchp, Stmthp1, FErrhp, 0, 0,
NULL, NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIStmtExecute(Stmthp1) : "
);
goto
error;
}
for
(;;)
{
r = OCIStmtFetch2(Stmthp1, FErrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
if
( r == OCI_NO_DATA )
break
;
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIStmtFetch2 : "
);
goto
error;
}
/*
tstd[0].ColumnName[30] = '\0';
DataType[30] = '\0';
DataLength[10] = '\0';
DataPrecision[10] = '\0';
DataScale[10]='\0';
Nullable[1]='\0';
colID[10] = '\0';
*/
for
(i = 0; i < 100; i++)
{
ColumnDes aColumn;
aColumn.ColumnName = AnsiString(tstd[i].ColumnName).TrimRight();
if
(aColumn.ColumnName.IsEmpty())
break
;
aColumn.DataType = AnsiString(tstd[i].DataType).TrimRight();
sscanf(tstd[i].DataLength,
"%d"
, &aColumn.DataLength);
sscanf(tstd[i].DataPrecision,
"%d"
, &aColumn.DataPrecision);
sscanf(tstd[i].DataScale,
"%d"
, &aColumn.DataScale);
if
(tstd[i].Nullable[0] ==
'y'
|| tstd[i].Nullable[0] ==
'Y'
)
aColumn.IsNull =
true
;
else
aColumn.IsNull =
false
;
//Add by Liaoyangbo
sscanf(tstd[i].colID,
"%d"
, &aColumn.ColId);
//增加对大对象的判断
/*if (BlobList.find(aColumn.DataType) != BlobList.end())
{
//该字段为大对象
aColumn.IsBlob = true;
//存在大对象(表)
isLob = true;
}
else
{
aColumn.IsBlob = false;
}*/
//判断该字段是否为LONG类型字段
if
(aColumn.DataType.UpperCase() ==
"LONG"
)
{
//该字段为LONG类型
aColumn.IsLong =
true
;
isLong =
true
;
}
else
{
aColumn.IsLong =
false
;
}
//End by Liaoyangbo
TableCols.push_back(aColumn);
}
}
//Add by Liaoyangbo
//表中存在大对象
if
(isLob)
{
//Table.IsBlob = true;
}
else
{
//Table.IsBlob = false;
}
//表中是否存在LONG字段类型
if
(isLong)
{
//Table.hasLong = true;
}
else
{
//Table.hasLong = false;
}
//End by Liaoyangbo
OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);
return
true
;
error :
if
( Stmthp1 != (OCIStmt*)OCI_INVALID_HANDLE )
OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);
return
false
;
}
bool
__fastcall HOracle::GetTableDataInfo(AnsiString tableName, AnsiString tableOwner, vector <TableData> &TableDatas)
{
sword r;
OCIDefine *Defnp[4];
typedef
struct
{
char
col1[10+1];
char
col2[10+1];
char
col3[10+1];
char
col4[10+1];
}stTableData;
stTableData tableData[100]= {0};
// 每次批量读取100行
OCIStmt *Stmthp1 = (OCIStmt*)OCI_INVALID_HANDLE;
string SqlStr1 = string(
"select * from "
);
SqlStr1 += tableOwner.c_str();
SqlStr1 += string(
"."
);
SqlStr1 += tableName.c_str();
//SqlStr1 += "";
Defnp[0] = (OCIDefine *) 0;
Defnp[1] = (OCIDefine *) 0;
Defnp[2] = (OCIDefine *) 0;
Defnp[3] = (OCIDefine *) 0;
r = OCIHandleAlloc(FEnvhp, (dvoid**)&Stmthp1, OCI_HTYPE_STMT, 0, NULL);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIHandleAlloc(Stmt1) : "
);
goto
error;
}
r = OCIStmtPrepare(Stmthp1, FErrhp, SqlStr1.c_str(),
SqlStr1.length(), OCI_NTV_SYNTAX, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIStmtPrepare(SqlStr1) : "
);
goto
error;
}
Defnp[0] = NULL;
r = OCIDefineByPos(Stmthp1, &Defnp[0], FErrhp, 1, &tableData[0].col1,
sizeof
(tableData[0].col1) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
goto
error;
}
Defnp[1] = NULL;
r = OCIDefineByPos(Stmthp1, &Defnp[1], FErrhp, 2, &tableData[0].col2,
sizeof
(tableData[0].col2) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
goto
error;
}
Defnp[2] = NULL;
r = OCIDefineByPos(Stmthp1, &Defnp[2], FErrhp, 3, &tableData[0].col3,
sizeof
(tableData[0].col3) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
goto
error;
}
Defnp[3] = NULL;
r = OCIDefineByPos(Stmthp1, &Defnp[3], FErrhp, 4, &tableData[0].col4,
sizeof
(tableData[0].col4) - 1, SQLT_CHR, NULL, NULL,
NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIDefineByPos : "
);
goto
error;
}
r = OCIDefineArrayOfStruct(Defnp[0], FErrhp,
sizeof
(stTableData), 0, 0, 0);
r = OCIDefineArrayOfStruct(Defnp[1], FErrhp,
sizeof
(stTableData), 0, 0, 0);
r = OCIDefineArrayOfStruct(Defnp[2], FErrhp,
sizeof
(stTableData), 0, 0, 0);
r = OCIDefineArrayOfStruct(Defnp[3], FErrhp,
sizeof
(stTableData), 0, 0, 0);
r = OCIStmtExecute(FSvchp, Stmthp1, FErrhp, 0, 0, NULL, NULL, OCI_DEFAULT);
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIStmtExecute(Stmthp1) : "
);
goto
error;
}
for
(;;)
{
r = OCIStmtFetch2(Stmthp1, FErrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
// OCI_FETCH_NEXT
if
( r == OCI_NO_DATA )
break
;
if
( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
{
CreateErrorString(
"OCIStmtFetch2 : "
);
goto
error;
}
for
(
int
i = 0; i < 100; i++)
{
TableData aData;
aData.col1 = AnsiString(tableData[i].col1).TrimRight();
if
(aData.col1.IsEmpty())
break
;
aData.col2 = AnsiString(tableData[i].col2).TrimRight();
aData.col3 = AnsiString(tableData[i].col3).TrimRight();
aData.col4 = AnsiString(tableData[i].col4).TrimRight();
TableDatas.push_back(aData);
}
}
return
true
;
error:
if
( Stmthp1 != (OCIStmt*)OCI_INVALID_HANDLE )
OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);
return
false
;
}
posted @
2011-11-19 17:04
bielidefeng
阅读(
359
) 评论(
0
)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面
返回顶部
公告