📄 sybasedb.c
字号:
pParam = &realData; nTypeLen = 4; break; case CS_FLOAT_TYPE: floatData = va_arg(argList, CS_FLOAT); pParam = &floatData; nTypeLen = 8; break; case CS_DECIMAL_TYPE: case CS_NUMERIC_TYPE: data = va_arg(argList, CNumeric); ParamFmt.scale = data.nScale; ParamFmt.precision = data.nPrecision; memset(&FormatFloat, 0, sizeof(CS_DATAFMT)); FormatFloat.datatype = CS_FLOAT_TYPE; FormatFloat.maxlength = sizeof(CS_FLOAT); rc = cs_convert(pDatabase->m_pContext, &FormatFloat, &data.dValue, &ParamFmt, &DataNumeric, NULL); pParam = (void *)&DataNumeric; nTypeLen = sizeof(CS_NUMERIC); break; /* 日期时间型 */ case CS_DATETIME_TYPE: time = va_arg(argList,CDateTime); tm_t.tm_year = time.nYear - 1900; tm_t.tm_mon = time.nMonth - 1; tm_t.tm_mday = time.nDay; tm_t.tm_hour = time.nHour; tm_t.tm_min = time.nMinute; tm_t.tm_sec = time.nSecond; tm_t.tm_isdst = -1; tt = mktime(&tm_t); if(tt == -1) { rc = CS_FAIL; DB_SetLastError(pDatabase, "Sybase DB_Open Client 动态SQL时间参数不对!"); break; } tm_t = *localtime(&tt); dt8.dtdays=tm_t.tm_year*365+(tm_t.tm_year-1)/4+tm_t.tm_yday; dt8.dttime=((tm_t.tm_hour*60+tm_t.tm_min)*60+tm_t.tm_sec)*300; pParam = &dt8; nTypeLen = 8; break; case CS_DATETIME4_TYPE: time = va_arg(argList,CDateTime); tm_t.tm_year = time.nYear - 1900; tm_t.tm_mon = time.nMonth - 1; tm_t.tm_mday = time.nDay; tm_t.tm_hour = time.nHour; tm_t.tm_min = time.nMinute; tm_t.tm_sec = 0; tm_t.tm_isdst = -1; tt = mktime(&tm_t); if(tt == -1) { rc = CS_FAIL; DB_SetLastError(pDatabase, "Sybase DB_Open Client 动态SQL时间参数不对!"); break; } tm_t = *localtime(&tt); dt4.days=tm_t.tm_year*365+(tm_t.tm_year-1)/4+tm_t.tm_yday; dt4.minutes=tm_t.tm_hour*60+tm_t.tm_min; pParam = &dt4; nTypeLen = 4; break; default: rc = CS_FAIL; DB_SetLastError(pDatabase, "DB_ExecuteStoredProcedure 存储过程参数类型不支持!"); break; } if( rc == CS_SUCCEED) { rc = ct_param(pCommand,&ParamFmt,(CS_VOID*)pParam, nTypeLen,CS_UNUSED); } }/* End of send parameters loop */ va_end(argList); } if(rc == CS_SUCCEED) { rc = ct_send(pCommand); if(rc == CS_SUCCEED) { rc = DB_HandleResults(pDatabase, pCommand); /* 取出存储过程执行结果返回码 */ if(rc == CS_SUCCEED) *npStatus = pDatabase->m_nStatus; } } ct_cmd_drop(pCommand); if(rc == CS_SUCCEED) return TRUE; DB_SetLastError(pDatabase, "ExecuteStoredProcedured 执行失败!"); return FALSE;}BOOL DB_BeginTransaction(CDatabase *pDatabase){ return DB_ExecuteSQL(pDatabase, "begin transaction");}BOOL DB_CommitTransaction(CDatabase *pDatabase){ return DB_ExecuteSQL(pDatabase, "commit transaction");}BOOL DB_RollbackTransaction(CDatabase *pDatabase){ return DB_ExecuteSQL(pDatabase, "rollback transaction");}CS_INT CS_PUBLIC DB_GetColumnLen(CS_DATAFMT *pColumn){ CS_INT nLen; switch((int)pColumn->datatype) { case CS_CHAR_TYPE: case CS_VARCHAR_TYPE: case CS_TEXT_TYPE: case CS_IMAGE_TYPE: nLen = pColumn->maxlength; break; case CS_BINARY_TYPE: case CS_VARBINARY_TYPE: nLen = 2 * pColumn->maxlength + 2; break; case CS_BIT_TYPE: case CS_TINYINT_TYPE: nLen = 1; break; case CS_SMALLINT_TYPE: nLen = 2; break; case CS_INT_TYPE: nLen = 4; break; case CS_REAL_TYPE: case CS_FLOAT_TYPE: nLen = CS_UNUSED; break; case CS_MONEY_TYPE: nLen = 8; break; case CS_MONEY4_TYPE: nLen = 4; break; case CS_DATETIME_TYPE: nLen = 8; break; case CS_DATETIME4_TYPE: nLen = 4; break; case CS_NUMERIC_TYPE: case CS_DECIMAL_TYPE: nLen = CS_UNUSED; break; default: nLen = CS_UNUSED; break; } return nLen;}/*************************************************** * 函数名:ExecuteStoreProcedureWithResult * 功能: 执行存储过程,支持输入任意个参数 * 返回值:成功--TRUE 失败--FALSE */BOOL DB_ExecuteStoredProcedureWithResult(CDatabase *pDatabase, char *pRpcName, int* npStatus, void *ppBindVar[], int cbBindVar, const unsigned char* pbParamInfo,...){ CS_COMMAND* pCommand; /* 命令指针 */ CS_RETCODE rc; /* 命令返回值 */ CS_DATAFMT ParamFmt; /* 参数格式 */ va_list argList; /* 变量参数 */ int nArgc = 0; /* 参数个数 */ const unsigned char * pb = pbParamInfo; char szParam[256]; int nParam; unsigned char tinyInt; unsigned short smallInt; CS_DATETIME dt8; CS_DATETIME4 dt4; CS_NUMERIC DataNumeric; CS_REAL realData; CS_FLOAT floatData; void *pParam; int nTypeLen; int nLoopCount = 0; CS_DATAFMT FormatFloat; CNumeric data; CDateTime time; struct tm tm_t; time_t tt; rc = ct_cmd_alloc(pDatabase->m_pConnection, &pCommand); RETURN_IF(pDatabase, rc, "Sybase DB_Open Client 分配命令结构指针失败!"); rc = ct_command(pCommand, CS_RPC_CMD, pRpcName, CS_NULLTERM, CS_NO_RECOMPILE); RETURN_IF(pDatabase, rc, "DB_ExecuteStoredProcedure:ct_command命令失败!"); if(pbParamInfo != NULL) { nArgc = strlen((const char *)pbParamInfo); } if(nArgc!=0) { va_start(argList, pbParamInfo); while (nLoopCount < nArgc && rc == CS_SUCCEED) { memset(&ParamFmt,0,sizeof(CS_DATAFMT)); ParamFmt.datatype = pb[nLoopCount]%0x20; ParamFmt.status = CS_INPUTVALUE; ParamFmt.maxlength = 255; switch (pb[nLoopCount++]) { /* 字符串型 */ case CS_CHAR_TYPE+0x20: strcpy(szParam, va_arg(argList, char*)); ParamFmt.locale = NULL; ParamFmt.format = CS_FMT_NULLTERM; pParam = (void *)szParam; nTypeLen = strlen((char*)pParam); break; /* 微型整数 */ case CS_TINYINT_TYPE: tinyInt = va_arg(argList, unsigned char); pParam = &tinyInt; nTypeLen = 1; break; /* 短整数 */ case CS_SMALLINT_TYPE: smallInt = va_arg(argList, short); pParam = &smallInt; nTypeLen = 2; break; /* 整数 */ case CS_INT_TYPE: nParam = va_arg(argList, int); pParam = &nParam; nTypeLen = 4; break; /* 浮点型 */ case CS_REAL_TYPE: realData = va_arg(argList, CS_REAL); pParam = &realData; nTypeLen = 4; break; case CS_FLOAT_TYPE: floatData = va_arg(argList, CS_FLOAT); pParam = &floatData; nTypeLen = 8; break; case CS_DECIMAL_TYPE: case CS_NUMERIC_TYPE: data = va_arg(argList, CNumeric); ParamFmt.scale = data.nScale; ParamFmt.precision = data.nPrecision; memset(&FormatFloat, 0, sizeof(CS_DATAFMT)); FormatFloat.datatype = CS_FLOAT_TYPE; FormatFloat.maxlength = sizeof(CS_FLOAT); rc = cs_convert(pDatabase->m_pContext, &FormatFloat, &data.dValue, &ParamFmt, &DataNumeric, NULL); pParam = (void *)&DataNumeric; nTypeLen = sizeof(CS_NUMERIC); break; /* 日期时间型 */ case CS_DATETIME_TYPE: time = va_arg(argList,CDateTime); tm_t.tm_year = time.nYear - 1900; tm_t.tm_mon = time.nMonth - 1; tm_t.tm_mday = time.nDay; tm_t.tm_hour = time.nHour; tm_t.tm_min = time.nMinute; tm_t.tm_sec = time.nSecond; tm_t.tm_isdst = -1; tt = mktime(&tm_t); if(tt == -1) { rc = CS_FAIL; DB_SetLastError(pDatabase, "Sybase DB_Open Client 动态SQL时间参数不对!"); break; } tm_t = *localtime(&tt); dt8.dtdays=tm_t.tm_year*365+(tm_t.tm_year-1)/4+tm_t.tm_yday; dt8.dttime=((tm_t.tm_hour*60+tm_t.tm_min)*60+tm_t.tm_sec)*300; pParam = &dt8; nTypeLen = 8; break; case CS_DATETIME4_TYPE: time = va_arg(argList,CDateTime); tm_t.tm_year = time.nYear - 1900; tm_t.tm_mon = time.nMonth - 1; tm_t.tm_mday = time.nDay; tm_t.tm_hour = time.nHour; tm_t.tm_min = time.nMinute; tm_t.tm_sec = 0; tm_t.tm_isdst = -1; tt = mktime(&tm_t); if(tt == -1) { rc = CS_FAIL; DB_SetLastError(pDatabase, "Sybase DB_Open Client 动态SQL时间参数不对!"); break; } tm_t = *localtime(&tt); dt4.days=tm_t.tm_year*365+(tm_t.tm_year-1)/4+tm_t.tm_yday; dt4.minutes=tm_t.tm_hour*60+tm_t.tm_min; pParam = &dt4; nTypeLen = 4; break; default: rc = CS_FAIL; DB_SetLastError(pDatabase, "DB_ExecuteStoredProcedure 存储过程参数类型不支持!"); break; } if( rc == CS_SUCCEED) { rc = ct_param(pCommand,&ParamFmt,(CS_VOID*)pParam, nTypeLen,CS_UNUSED); } }/* End of send parameters loop */ va_end(argList); } if(rc == CS_SUCCEED) { rc = ct_send(pCommand); if(rc == CS_SUCCEED) { rc = DB_HandleResultsWithResult(pDatabase, pCommand,ppBindVar, cbBindVar); /* 取出存储过程执行结果返回码 */ if(rc == CS_SUCCEED) *npStatus = pDatabase->m_nStatus; } } ct_cmd_drop(pCommand); if(rc == CS_SUCCEED) return TRUE; DB_SetLastError(pDatabase, "ExecuteStoredProcedured 执行失败!"); return FALSE;}CS_RETCODE DB_HandleResultsWithResult(CDatabase *pDatabase, CS_COMMAND *pCmd,void *ppBindVar[], int cbBindVar){ CS_RETCODE nRetCode; CS_INT nResultType; CS_DATAFMT fmtStatus; CS_DATAFMT DataFormat; int i; /* ** Loop on a request to return result description ** until no more are available */ while(CS_SUCCEED == (nRetCode = ct_results(pCmd, &nResultType))) { /* ** All result types are handled in the same way. ** We want to indicate the order in which they are returned. */ switch((int)nResultType) { case CS_ROW_RESULT: /* ** There are rows to process ** Code needs to be added to process */ for (i=0; i<cbBindVar; i++) { memset(&DataFormat, 0, sizeof(CS_DATAFMT)); ct_describe(pCmd, i+1, &DataFormat); DataFormat.count=1; if (DataFormat.datatype==CS_CHAR_TYPE) { DataFormat.format=CS_FMT_PADBLANK; } ct_bind(pCmd,i+1,&DataFormat,ppBindVar[i],NULL,NULL); } /*取数据*/ while(TRUE) { nRetCode = ct_fetch(pCmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, NULL); if(nRetCode == CS_ROW_FAIL) continue; if(nRetCode != CS_SUCCEED) break; } break; case CS_CMD_SUCCEED: /* ** A select command succeeded which returns no rows */ break; case CS_CMD_DONE: /* ** Done with one result set, go on to the next. */ break; case CS_CMD_FAIL: /* ** The server encountered an error */ ct_cancel(NULL, pCmd, CS_CANCEL_ALL); DB_SetLastError(pDatabase, "Sybase DB_Open Client 服务器发生错误!"); return CS_FAIL; break; case CS_PARAM_RESULT: /* ** There are return parameters available */ break; case CS_STATUS_RESULT: /* ** Return status */ memset(&fmtStatus, 0, sizeof(CS_DATAFMT)); fmtStatus.datatype = CS_INT_TYPE; fmtStatus.maxlength = sizeof(CS_INT); fmtStatus.count = 1; nRetCode = ct_bind(pCmd, 1, &fmtStatus, &pDatabase->m_nStatus, NULL, NULL); if(nRetCode != CS_SUCCEED) return CS_FAIL; while(TRUE) { nRetCode = ct_fetch(pCmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, NULL); if(nRetCode == CS_ROW_FAIL) continue; if(nRetCode != CS_SUCCEED) break; } if(nRetCode != CS_END_DATA) { DB_SetLastError(pDatabase, "HandleResult 返回码出错!"); return CS_FAIL; } break; case CS_COMPUTE_RESULT: /* ** Compute row */ break; default: /* ** We got something unexpected. */ ct_cancel(NULL, pCmd, CS_CANCEL_ALL); DB_SetLastError(pDatabase, "Sybase DB_Open Client 结果集返回一个未知的结果类型!"); return CS_FAIL; }/* End type of results switch */ }/* End while results pending loop */ if(nRetCode == CS_END_RESULTS) { /* Normal termination of loop */ return(CS_SUCCEED); } return CS_FAIL;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -