//******************************************************************************** // // AUTHOR : ZhangKeHeng // // FUNCTION : 商用库访问类定义 // // TIME : 2003.05.17 // // HISTORY : // Datetime Action Author Reason // ------------------------------------------------------------------------------ // 2003.05.17 Creation ZhangKeHeng // 2003.09.01 Modify ZhangKeHeng AppKeyId AppId支持 // 2003.11.26 Modify ZhangKeHeng ORACLE LOB(Large OBject)支持 // 2003.12.06 Modify ZhangKeHeng SYBASE LOB(TEXT/IMAGE) 支持 // 2003.12.07 Modify ZhangKeHeng UNSIGNED CHAR -1支持 // time : 2011.01.13 ChenPeng 增加绑定变量接口相关结构 //******************************************************************************** #ifndef _DB_ACCESS_H #define _DB_ACCESS_H #ifdef __WINDOWS64 #ifdef DBACCESS_EXPORTS #define DBACCESS_API __declspec(dllexport) #else #define DBACCESS_API __declspec(dllimport) #endif #else #define DBACCESS_API #endif #include #include #include #include #include #include #include #include #include #ifdef _APP_SYS_SUBSTATION #include "db_com/sqlite_server_client.h" #endif #ifdef _WIN64 // Windows compatible version #define strcasecmp _stricmp #endif #define DB_SUCCESS 0 #define DB_FAIL -1 #define DB_NO_DATA 100 #define DB_AUTO_LOGOFF 0 #define DB_MANUAL_LOGOFF 1 #define DB_STATUS_CONNECT 0 #define DB_STATUS_DISCONNECT 1 #define GET_ALL_RESULT -1 #define LOGIN_DEFAULT_MODE 0 #define LOGIN_THREADED_MODE 1 //统一C数据类型 #define DB_DATATYPE_STRING 1 #define DB_DATATYPE_UCHAR 2 #define DB_DATATYPE_SHORT 3 #define DB_DATATYPE_INT 4 #define DB_DATATYPE_DATETIME 5 #define DB_DATATYPE_FLOAT 6 #define DB_DATATYPE_DOUBLE 7 #define DB_DATATYPE_KEYID 8 #define DB_DATATYPE_BINARY 9 #define DB_DATATYPE_TEXT 10 #define DB_DATATYPE_IMAGE 11 #define DB_DATATYPE_APPKEYID 12 #define DB_DATATYPE_APPID 13 #define DB_DATATYPE_LONG 15 #define MAX_COL_NUMBER 1024 #define MAX_LOB_NUMBER 1024 #define MAX_COLNAME_LENGTH 255 #define MAX_PROCNAME_LENGTH 255 #define MAX_SQL_LENGTH 10240 #define QUERY_RECORD_BUF 102400 // 记录集预分配内存100K #ifdef _ALPHA #define READ_BUFSIZE 204800 // #endif #ifdef _IBM #define READ_BUFSIZE 204800 // #endif #ifdef _SUN #define READ_BUFSIZE 102400 // #endif #ifdef _HPUX #define READ_BUFSIZE 204800 // #endif #ifdef _LINUX #define READ_BUFSIZE 204800 // #endif struct DBACCESS_API TResultHead { int field_num; int field_size; int data_num; int data_size; int record_length; int reach_max; }; #ifndef _APP_SYS_SUBSTATION struct DBACCESS_API TFieldInfo { short field_type; short field_length; char col_name[256]; }; #else struct DBACCESS_API TFieldInfo { short field_type; short field_length; }; #endif // Define the KeyID_Type's Description struct DBACCESS_API TKeyidType { int record_id; short column_id; }; // Define the AppKeyID_Type's Description //struct DBACCESS_API TAppKeyidType //{ // int app_id; // int record_id; // short column_id; //}; struct DBACCESS_API TAppKeyidType { long key_id; int app_id; }; // Define the AppID_Type's Description struct DBACCESS_API TAppidType { int app_id; int record_id; }; #ifndef _APP_SYS_SUBSTATION union DBACCESS_API UColumnVal { unsigned char unsigned_value; short short_value; int int_value; float float_value; double double_value; OCIDate date_value; unsigned char bin_value[10240]; char string_value[10240]; UColumnVal() { memset(this,0,sizeof(UColumnVal)); } }; #endif struct DBACCESS_API TFieldAttr { //char *colName; char colName[256]; unsigned int colNameLen; unsigned short field_type; unsigned int field_len; unsigned char field_precision; signed char field_scale; TFieldAttr() { memset(this,0,sizeof(TFieldAttr)); } }; using namespace std; //错误信息结构 struct DBACCESS_API TErrorMsg { int err_no; //DBAccess错误号 int ora_errno; //数据库错误号 string dbaccess_err; //DBAccess错误信息 string db_err; //数据库错误信息 }; struct TDCIBindParaStru { unsigned short dci_type; // 绑定变量数据类型 具体数值参见dci.h中SQLT开头的一系列宏定义 unsigned int data_size; // 绑定变量数据长度 }; typedef vector SEQDCIBindParaStru; //LOB使用的ResultHead struct DBACCESS_API TLOBResultHead { int field_num; int field_size; int data_num; int data_size; vector record_length_vec; //如果data_num==0则record_length_vec不可用 int reach_max; }; //LOB使用的FieldInfo struct DBACCESS_API TLOBFieldInfo { short field_type; vector field_length_vec; //field_length_vec.size等于TLOBResultHead中的data_num //如果data_num == 0, 则field_length_vec.size = 1 }; //LOB内容结构 struct DBACCESS_API TLOBContent { unsigned char *lob_content; int lob_content_size; }; //UserSpecTypeMap first元素为指定域号 // second元素为用户指定数据类型,其取值为统一C数据类型 typedef map UserSpecTypeMap; #ifndef _APP_SYS_SUBSTATION class DBACCESS_API CDbAccess { public: //构造函数auto_logoff == true 或无参数时,不需要显示调用Logoff,会在析构函数中调用 //反之,程序需要显示调用Logoff注销数据库登录,否则连接没有释放 CDbAccess(bool auto_logoff = true); //析构函数 ~CDbAccess(); private: OCIEnv *m_pEnvhp; OCIError *m_pErrhp; OCISvcCtx *m_pSvchp; OCILobLocator *m_pLob; //OCIStmt *m_pStmhp1; //OCIStmt *m_pStmhp2; private: int PrintError(OCIError *errhp, sword status, string &err_string, int &ora_errno); int InitHandles(ub4 mode,vector &err_vec); int InitOneStatement(OCIStmt **stmhp,vector &err_vec); int FreeOneStatement(OCIStmt *stmhp,vector &err_vec); int PrepareOneSentence(OCIStmt *stmhp,text *sql_sen,vector &err_vec); int ExecuteOneSelectSentence(OCIStmt *stmhp,vector &err_vec); int ExecuteOneModifySentence(OCIStmt *stmhp,ub4 commit_flag,int step,vector &err_vec); int ExecuteOneModifySentence(OCIStmt *stmhp,ub4 commit_flag,int step,vector &err_vec,int &affect_record_num); int ExecuteSentenceOnlyDiscribe(OCIStmt *stmhp,vector &err_vec); int FetchNextRow(OCIStmt *stmhp,int step,vector &err_vec); int CancelFetch(OCIStmt *stmhp,vector &err_vec); int GetFetchRowNum(OCIStmt *stmhp,int *stmrow,vector &err_vec); int DefineArrayOfStruct(OCIDefine *defhp,int recorderlen,int num_cols,vector &err_vec); int BindArrayOfStruct(OCIBind *defhp ,int recorderlen,int num_cols,vector &err_vec); int GetSelectColNum(OCIStmt *stmhp,int *col_num,vector &err_vec); int GetSingleColInfo(OCIStmt *stmhp,ub4 pos,TFieldAttr &field_attr,vector &err_vec); int BindByPosition(OCIStmt *stmhp,OCIBind **bind_pp,ub4 position,dvoid *value_p,sb4 value_size,ub2 data_type,dvoid *indicator_p,vector &err_vec); int BindByName(OCIStmt *stmhp,OCIBind **bind_pp,OraText *placeholder,dvoid *value_p,sb4 value_size,ub2 data_type,dvoid *indicator_p,vector &err_vec); int DefineByPosition(OCIStmt *stmhp,OCIDefine **define_pp,ub4 position,dvoid *value_p,sb4 value_size,ub2 data_type,dvoid *indicator_p,vector &err_vec); int CheckAndRestorePackageStatus(char *pck_name,vector &err_vec); // int ConvertSQLDateToTimet(char* date_ptr,time_t *osdate); // int ConvertOCIDateToTimet(OCIDate odate,time_t *osdate); // int ConvertTimetToOCIDate(time_t OsDate,OCIDate *OciDate); string ConvertSQLDateToString(char* date_ptr); private: int m_Status; int m_LoginMode; int m_LogoffFlag; private: TKeyidType* ConvertKeyidToStruct(char *keyid); TAppKeyidType* ConvertAppKeyidToStruct(char *keyid); TAppidType* ConvertAppidToStruct(char *keyid); // char* ConvertStructToKeyid(TKeyidType* keyid_type); public: /*--------------------------------------------------------------------------------- - 功能描述: 数据库注册 - 输 入: user_name: 用户名称 passwd: 口令 server: 服务名 mode: 模式 LOGIN_DEFAULT_MODE 普通模式 LOGIN_THREADED_MODE 多线程模式 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int Login( char *user_name, char *passwd, char *server, unsigned int mode, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 数据库注销 - 输 入: 无 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int Logoff(vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 取连接状态 - 输 入: 无 - 输 出: 无 - 返 回: DB_STATUS_CONNECT: 保持连接 DB_STATUS_DISCONNECT: 失去连接 ----------------------------------------------------------------------------------*/ int GetConnectStatus(); /*--------------------------------------------------------------------------------- - 功能描述: 设置连接状态 - 输 入: status: 设置连接状态 - 输 出: 无 - 返 回: DB_SUCCESS: 成功 ----------------------------------------------------------------------------------*/ int SetConnectStatus(int status); /*--------------------------------------------------------------------------------- - 功能描述: 开始事务 - 输 入: 无 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int BeginTransaction(vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 提交事务 - 输 入: 无 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int CommitTransaction(vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 回滚事务 - 输 入: 无 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int RollbackTransaction(vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 执行SQL命令,并提交 - 输 入: cmd_string: SQL命令 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int ExecuteCommandWithCommit(char *cmd_string, vector &err_vec ); int ExecuteCommandWithCommit(char *cmd_string, int &affected_record_num, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 利用绑定变量方式执行SQL命令,并提交 - 输入参数 : sql_str 需要提交SQL语句 - 输出参数 : out_db_error 错误信息 - 输入参数 : rep_flag 是否复制 - 返回值 : TRUE 执行成功 - FALSE 执行失败 ----------------------------------------------------------------------------------*/ int BindExecuteCommandWithCommit(char *cmd_string, SEQDCIBindParaStru &seq_bind_para, void * data_buffer, unsigned short * null_flag_buffer, unsigned int row_num, vector &err_vec); // int ExecuteCommandWithCommitEx(char *cmd_string, // vector &err_vec // ); /*--------------------------------------------------------------------------------- - 功能描述: 执行SQL命令,不提交 - 输 入: cmd_string: SQL命令 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int ExecuteCommandWithoutCommit(char *cmd_string, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 取SQL查询返回结果集(不包含LOB类型数据) - 输 入: query_string: SQL查询命令 max_result: 结果集最大行数,GET_ALL_RESULT表示取所有行 user_type_map: 用户指定返回数据类型,MAP类型 - 输 出: result_link: 结果集指针 result_indicator 是否为空指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryResult( char *query_string, int max_result, UserSpecTypeMap user_type_map, char *&result_link, signed short *&result_indicator, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 取结果集的HEAD,FIELD,DATA指针 - 输 入: result_link: 结果集指针 - 输 出: result_head_ptr: HEAD指针 field_info_ptr: FIELD指针 data_ptr: DATA指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryHead( char *result_link, TResultHead *&result_head_ptr, TFieldInfo *&field_info_ptr, char *&data_ptr, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 取存储过程查询返回结果集 - 输 入: pck_name: 包名称(SYBASE该参数为NULL) proc_name: 存储过程名称 parm_vec: 存储过程参数Vector(1~n个),对于ORACLE返回游标参数无需指定 参数以vector形式传入,即不论类型全部为string 日期型参数以YYYY-MM-DD HH:MM:SS形式传入 max_result: 结果集最大行数,GET_ALL_RESULT表示取所有行 user_type_map: 用户指定返回数据类型,MAP类型 - 输 出: result_link: 结果集指针 result_indicator 是否为空指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetProcedureResult( char *pck_name, char *proc_name, vector parm_vec, int max_result, UserSpecTypeMap user_type_map, char *&result_link, signed short *&result_indicator, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 执行存储过程(无返回结果集) - 输 入: pck_name: 包名称(SYBASE该参数为NULL) proc_name: 存储过程名称 parm_vec: 存储过程参数Vector(1~n个),对于ORACLE返回游标参数无需指定 参数以vector形式传入,即不论类型全部为string 日期型参数以YYYY-MM-DD HH:MM:SS形式传入 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int ExecuteProcedure ( char *pck_name, char *proc_name, vector parm_vec, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 返回执行存储过程(无返回结果集)的实际PLSQL语句 需配合ExecuteProcedure执行,只有ExecuteProcedure执行成功后调用该函数才有意义 - 输 入: pck_name: 包名称(SYBASE该参数为NULL) proc_name: 存储过程名称 parm_vec: 存储过程参数Vector(1~n个),对于ORACLE返回游标参数无需指定 参数以vector形式传入,即不论类型全部为string 日期型参数以YYYY-MM-DD HH:MM:SS形式传入 - 输 出: err_vec: 错误返回结构Vector - 返 回: SQL语句: 由pck_name、proc_name、parm_vec构造SQL语句 "" : 返回为""表示错误 ----------------------------------------------------------------------------------*/ string GetProcedureSQL ( char *pck_name, char *proc_name, vector parm_vec, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 判断指定的表(table)是否存在 - 输 入: table_name: 表名称 - 返 回: ture: 表存在 false: 表不存在 ----------------------------------------------------------------------------------*/ bool TableExist ( char *table_name ); /*--------------------------------------------------------------------------------- - 功能描述: 将传入字符串转换为大写 - 输 入: str: 传入字符串 - 输 出: str: 传出字符串(大写) - 返 回: 无 ----------------------------------------------------------------------------------*/ void UpperString (char * & str); /*================================================================================*/ /* */ /* LOB(Large OBject)支持 */ /* */ /* 例子中所使用表为MY_TEST_LOB */ /* 【ORACLE】DDL语句为: */ /* CREATE TABLE MY_TEST_LOB( */ /* ID NUMBER(10) NOT NULL, */ /* CLOB_CONTENT CLOB, */ /* BLOB_CONTENT BLOB, */ /* NAME VARCHAR2(32), */ /* KEYID_V CHAR(14), */ /* APPKEYID_V CHAR(24), */ /* APPID_V CHAR(20), */ /* DATE_V DATE, */ /* FLOAT_V NUMBER(22, 6), */ /* CONSTRAINT PK_TEST_LOB PRIMARY KEY(ID)) */ /* */ /* 【SYBASE】DDL语句为: */ /* CREATE TABLE MY_LOB_TEST( */ /* ID INT, */ /* CLOB_CONTENT TEXT NULL, */ /* BLOB_CONTENT IMAGE NULL, */ /* NAME VARCHAR(32) NULL, */ /* KEYID_V CHAR(14) NULL, */ /* APPKEYID_V CHAR(24) NULL, */ /* APPID_V CHAR(20) NULL, */ /* DATE_V DATETIME NULL, */ /* FLOAT_V REAL NULL, */ /* CONSTRAINT PK_TEST_LOB PRIMARY KEY(ID)) */ /* */ /* */ /*================================================================================*/ /*--------------------------------------------------------------------------------- - 功能描述: 执行包含LOB数据的INSERT命令,并提交 - 输 入: insert_string: INSERT(LOB)命令 select_string: 附加的SELECT FOR UPDATE(只需要写LOB域)命令 lob_vec: LOB域的Vector - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 - 说 明: 1、insert_string参数举例 【ORACLE】"insert into my_test_lob(id,clob_content,blob_content) values(1,empty_clob(),empty_blob())" 【SYBASE】"insert into my_test_lob(id,clob_content,blob_content) values(1,'','')" 如果需要在select语句中更新LOB域,注意不要在Insert语句中将LOB域置为空(NULL) 对于ORACLE使用empty_clob()、empty_blob()插入EMPTY 对于SYBASE使用''插入EMPTY 2、select_string参数举例 【ORACLE】"select clob_content,blob_content from my_test_lob where id = 1 for update" 【SYBASE】"select clob_content,blob_content from my_test_lob where id = 1" 注意:若where子句不对应insert语句中的主键,则更新结果不可预见 对于ORACLE “for update”关键词是必须的 3、lob_vec包含LOB实际数据,lob_vec.size()必须与select_string中LOB域的个数一致 ----------------------------------------------------------------------------------*/ int ExecuteInsertCommandWithLOB( const char *insert_string, const char *select_string, const vector &lob_vec, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 执行包含LOB数据的UPDATE命令,并提交 - 输 入: update_string: UPDATE(LOB)命令 select_string: 附加的SELECT FOR UPDATE(只需要写LOB域)命令 lob_vec: LOB域的Vector - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 - 说 明: 1、update_string参数举例 【ORACLE】"update my_test_lob set blob_content = empty_blob() where id = 1" 【SYBASE】"update my_test_lob set blob_content = '' where id = 1" 如果需要在select语句中更新LOB域,注意不要在Update语句中将LOB域置为空(NULL) 对于ORACLE使用empty_clob()、empty_blob()插入EMPTY 对于SYBASE使用''插入EMPTY 2、select_string参数举例 【ORACLE】"select clob_content,blob_content from my_test_lob where id = 1 for update" 【SYBASE】"select clob_content,blob_content from my_test_lob where id = 1" 注意:若where子句不对应update语句中的主键,则更新结果不可预见 2、lob_vec包含LOB实际数据,lob_vec.size()必须与select_string中LOB域的个数一致 ----------------------------------------------------------------------------------*/ int ExecuteUpdateCommandWithLOB( const char *update_string, const char *select_string, const vector &lob_vec, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 取SQL查询返回结果集(包含LOB类型数据) - 输 入: query_string: SQL查询命令 max_result: 结果集最大行数,GET_ALL_RESULT表示取所有行 user_type_map: 用户指定返回数据类型,MAP类型 注意LOB域无法指定数据类型 - 输 出: result_link: 结果集指针 result_indicator 是否为空指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 - 说 明: 1、由于SYBASE数据库要求检索的LOB域都必须放在BIND域(普通域)的后面 因此统一要求query_string中的所有LOB域都在普通域之后 ----------------------------------------------------------------------------------*/ int GetQueryResultWithLOB( const char *query_string, int max_result, UserSpecTypeMap user_type_map, char *&result_link, signed short *&result_indicator, TLOBResultHead *&result_head_ptr, TLOBFieldInfo *&field_info_ptr, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 取结果集的HEAD,FIELD,DATA指针(包含LOB类型数据) - 输 入: result_link: 结果集指针 - 输 出: result_head_ptr: HEAD指针,对应TLOBResultHead结构 field_info_ptr: FIELD指针,对应TLOBFieldInfo结构 data_ptr: DATA指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryHeadWithLOB( char *result_link, TLOBResultHead *&result_head_ptr, TLOBFieldInfo *&field_info_ptr, char *&data_ptr, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 取SQL查询返回结果集(不包含LOB类型数据)形成指定ASCII文件 - 输 入: query_string: SQL查询命令 file_name: 输出文件名称(含绝对路径) - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryResultToFile(const char *query_string, const char *file_name, vector &err_vec ); }; #else class DBACCESS_API CDbAccess { public: //构造函数auto_logoff == true 或无参数时,不需要显示调用Logoff,会在析构函数中调用 //反之,程序需要显示调用Logoff注销数据库登录,否则连接没有释放 //需指定文件库的路径 如:/home/d5000/kf/sqlite-autoconf-3070900/test.db CDbAccess(bool auto_logoff = true); //析构函数 ~CDbAccess(); //为复制功能提供设置主机名的接口 int SetHostName(char* host_name); private: int m_Status; int m_LoginMode; int m_LogoffFlag; private: SqliteServerClient *m_sqlite_server_client; private: TKeyidType* ConvertKeyidToStruct(char *keyid); TAppKeyidType* ConvertAppKeyidToStruct(char *keyid); TAppidType* ConvertAppidToStruct(char *keyid); // int ConvertSQLDateToTimet(char* date_ptr,time_t *osdate); public: /*--------------------------------------------------------------------------------- - 功能描述: 数据库注册 - 输 入: user_name: 用户名称 passwd: 口令 server: 服务名 mode: 模式 LOGIN_DEFAULT_MODE 普通模式 LOGIN_THREADED_MODE 多线程模式 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int Login( char *user_name, char *passwd, char *server, unsigned int mode, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 数据库注册 - 输 入: user_name: 用户名称 passwd: 口令 server: 服务名 mode: 模式 LOGIN_DEFAULT_MODE 普通模式 LOGIN_THREADED_MODE 多线程模式 host_name: 主机名 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int Login( char *user_name, char *passwd, char *server, unsigned int mode, char * host_name, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 数据库注销 - 输 入: 无 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int Logoff(vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 取连接状态 - 输 入: 无 - 输 出: 无 - 返 回: DB_STATUS_CONNECT: 保持连接 DB_STATUS_DISCONNECT: 失去连接 ----------------------------------------------------------------------------------*/ int GetConnectStatus(); /*--------------------------------------------------------------------------------- - 功能描述: 设置连接状态 - 输 入: status: 设置连接状态 - 输 出: 无 - 返 回: DB_SUCCESS: 成功 ----------------------------------------------------------------------------------*/ int SetConnectStatus(int status); /*--------------------------------------------------------------------------------- - 功能描述: 开始事务 - 输 入: 无 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int BeginTransaction(vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 提交事务 - 输 入: 无 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int CommitTransaction(vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 回滚事务 - 输 入: 无 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int RollbackTransaction(vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 取SQL查询返回结果集(不包含LOB类型数据) - 输 入: query_string: SQL查询命令 max_result: 结果集最大行数,GET_ALL_RESULT表示取所有行 user_type_map: 用户指定返回数据类型,MAP类型 - 输 出: result_link: 结果集指针 result_indicator 是否为空指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryResult(char *query_string, int max_result, UserSpecTypeMap user_type_map, char *&result_link, signed short *&result_indicator, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 取结果集的HEAD,FIELD,DATA指针 - 输 入: result_link: 结果集指针 - 输 出: result_head_ptr: HEAD指针 field_info_ptr: FIELD指针 data_ptr: DATA指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryHead(char *result_link, TResultHead *&result_head_ptr, TFieldInfo *&field_info_ptr, char *&data_ptr, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 执行SQL命令,并提交 - 输 入: cmd_string: SQL命令 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int ExecuteCommandWithCommit(char *cmd_string, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 利用绑定变量方式执行SQL命令,并提交 - 输入参数 : sql_str 需要提交SQL语句 - 输出参数 : out_db_error 错误信息 - 输入参数 : rep_flag 是否复制 - 返回值 : TRUE 执行成功 - FALSE 执行失败 ----------------------------------------------------------------------------------*/ int BindExecuteCommandWithCommit(char *cmd_string, SEQDCIBindParaStru &seq_bind_para, void *data_buffer, unsigned short * null_flag_buffer, unsigned int row_num, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 执行SQL命令,不提交 - 输 入: cmd_string: SQL命令 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int ExecuteCommandWithoutCommit(char *cmd_string, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 取存储过程查询返回结果集 - 输 入: pck_name: 包名称(SYBASE该参数为NULL) proc_name: 存储过程名称 parm_vec: 存储过程参数Vector(1~n个),对于ORACLE返回游标参数无需指定 参数以vector形式传入,即不论类型全部为string 日期型参数以YYYY-MM-DD HH:MM:SS形式传入 max_result: 结果集最大行数,GET_ALL_RESULT表示取所有行 user_type_map: 用户指定返回数据类型,MAP类型 - 输 出: result_link: 结果集指针 result_indicator 是否为空指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetProcedureResult( char *pck_name, char *proc_name, vector parm_vec, int max_result, UserSpecTypeMap user_type_map, char *&result_link, signed short *&result_indicator, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 执行存储过程(无返回结果集) - 输 入: pck_name: 包名称(SYBASE该参数为NULL) proc_name: 存储过程名称 parm_vec: 存储过程参数Vector(1~n个),对于ORACLE返回游标参数无需指定 参数以vector形式传入,即不论类型全部为string 日期型参数以YYYY-MM-DD HH:MM:SS形式传入 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int ExecuteProcedure ( char *pck_name, char *proc_name, vector parm_vec, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 返回执行存储过程(无返回结果集)的实际PLSQL语句 需配合ExecuteProcedure执行,只有ExecuteProcedure执行成功后调用该函数才有意义 - 输 入: pck_name: 包名称(SYBASE该参数为NULL) proc_name: 存储过程名称 parm_vec: 存储过程参数Vector(1~n个),对于ORACLE返回游标参数无需指定 参数以vector形式传入,即不论类型全部为string 日期型参数以YYYY-MM-DD HH:MM:SS形式传入 - 输 出: err_vec: 错误返回结构Vector - 返 回: SQL语句: 由pck_name、proc_name、parm_vec构造SQL语句 "" : 返回为""表示错误 ----------------------------------------------------------------------------------*/ string GetProcedureSQL ( char *pck_name, char *proc_name, vector parm_vec, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 判断指定的表(table)是否存在 - 输 入: table_name: 表名称 - 返 回: ture: 表存在 false: 表不存在 ----------------------------------------------------------------------------------*/ bool TableExist( char *table_name ); /*--------------------------------------------------------------------------------- - 功能描述: 将传入字符串转换为大写 - 输 入: str: 传入字符串 - 输 出: str: 传出字符串(大写) - 返 回: 无 ----------------------------------------------------------------------------------*/ void UpperString(char * & str); /*================================================================================*/ /* */ /* LOB(Large OBject)支持 */ /* */ /* 例子中所使用表为MY_TEST_LOB */ /* 【ORACLE】DDL语句为: */ /* CREATE TABLE MY_TEST_LOB( */ /* ID NUMBER(10) NOT NULL, */ /* CLOB_CONTENT CLOB, */ /* BLOB_CONTENT BLOB, */ /* NAME VARCHAR2(32), */ /* KEYID_V CHAR(14), */ /* APPKEYID_V CHAR(24), */ /* APPID_V CHAR(20), */ /* DATE_V DATE, */ /* FLOAT_V NUMBER(22, 6), */ /* CONSTRAINT PK_TEST_LOB PRIMARY KEY(ID)) */ /* */ /* 【SYBASE】DDL语句为: */ /* CREATE TABLE MY_LOB_TEST( */ /* ID INT, */ /* CLOB_CONTENT TEXT NULL, */ /* BLOB_CONTENT IMAGE NULL, */ /* NAME VARCHAR(32) NULL, */ /* KEYID_V CHAR(14) NULL, */ /* APPKEYID_V CHAR(24) NULL, */ /* APPID_V CHAR(20) NULL, */ /* DATE_V DATETIME NULL, */ /* FLOAT_V REAL NULL, */ /* CONSTRAINT PK_TEST_LOB PRIMARY KEY(ID)) */ /* */ /* */ /*================================================================================*/ /*--------------------------------------------------------------------------------- - 功能描述: 执行包含LOB数据的INSERT命令,并提交 - 输 入: insert_string: INSERT(LOB)命令 select_string: 附加的SELECT FOR UPDATE(只需要写LOB域)命令 lob_vec: LOB域的Vector - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 - 说 明: 1、insert_string参数举例 【ORACLE】"insert into my_test_lob(id,clob_content,blob_content) values(1,empty_clob(),empty_blob())" 【SYBASE】"insert into my_test_lob(id,clob_content,blob_content) values(1,'','')" 如果需要在select语句中更新LOB域,注意不要在Insert语句中将LOB域置为空(NULL) 对于ORACLE使用empty_clob()、empty_blob()插入EMPTY 对于SYBASE使用''插入EMPTY 2、select_string参数举例 【ORACLE】"select clob_content,blob_content from my_test_lob where id = 1 for update" 【SYBASE】"select clob_content,blob_content from my_test_lob where id = 1" 注意:若where子句不对应insert语句中的主键,则更新结果不可预见 对于ORACLE “for update”关键词是必须的 3、lob_vec包含LOB实际数据,lob_vec.size()必须与select_string中LOB域的个数一致 ----------------------------------------------------------------------------------*/ int ExecuteInsertCommandWithLOB( const char *insert_string, const char *select_string, const vector &lob_vec, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 执行包含LOB数据的UPDATE命令,并提交 - 输 入: update_string: UPDATE(LOB)命令 select_string: 附加的SELECT FOR UPDATE(只需要写LOB域)命令 lob_vec: LOB域的Vector - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 - 说 明: 1、update_string参数举例 【ORACLE】"update my_test_lob set blob_content = empty_blob() where id = 1" 【SYBASE】"update my_test_lob set blob_content = '' where id = 1" 如果需要在select语句中更新LOB域,注意不要在Update语句中将LOB域置为空(NULL) 对于ORACLE使用empty_clob()、empty_blob()插入EMPTY 对于SYBASE使用''插入EMPTY 2、select_string参数举例 【ORACLE】"select clob_content,blob_content from my_test_lob where id = 1 for update" 【SYBASE】"select clob_content,blob_content from my_test_lob where id = 1" 注意:若where子句不对应update语句中的主键,则更新结果不可预见 2、lob_vec包含LOB实际数据,lob_vec.size()必须与select_string中LOB域的个数一致 ----------------------------------------------------------------------------------*/ int ExecuteUpdateCommandWithLOB( const char *update_string, const char *select_string, const vector &lob_vec, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 取SQL查询返回结果集(包含LOB类型数据) - 输 入: query_string: SQL查询命令 max_result: 结果集最大行数,GET_ALL_RESULT表示取所有行 user_type_map: 用户指定返回数据类型,MAP类型 注意LOB域无法指定数据类型 - 输 出: result_link: 结果集指针 result_indicator 是否为空指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 - 说 明: 1、由于SYBASE数据库要求检索的LOB域都必须放在BIND域(普通域)的后面 因此统一要求query_string中的所有LOB域都在普通域之后 ----------------------------------------------------------------------------------*/ int GetQueryResultWithLOB( const char *query_string, int max_result, UserSpecTypeMap user_type_map, char *&result_link, signed short *&result_indicator, TLOBResultHead *&result_head_ptr, TLOBFieldInfo *&field_info_ptr, vector &err_vec ); /*--------------------------------------------------------------------------------- - 功能描述: 取结果集的HEAD,FIELD,DATA指针(包含LOB类型数据) - 输 入: result_link: 结果集指针 - 输 出: result_head_ptr: HEAD指针,对应TLOBResultHead结构 field_info_ptr: FIELD指针,对应TLOBFieldInfo结构 data_ptr: DATA指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryHeadWithLOB( char *result_link, TLOBResultHead *&result_head_ptr, TLOBFieldInfo *&field_info_ptr, char *&data_ptr, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 取SQL查询返回结果集(不包含LOB类型数据)形成指定ASCII文件 - 输 入: query_string: SQL查询命令 file_name: 输出文件名称(含绝对路径) - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryResultToFile(const char *query_string, const char *file_name, vector &err_vec ); }; #endif #endif