📄 sybasedb.c
字号:
szErrorMsg[0] = 0; sprintf(szError, "\nSybase 客户端消息:\n"); strcat(szErrorMsg,szError); sprintf(szError, "消息号: LAYER = (%ld) ORIGIN = (%ld) ", CS_LAYER(errmsg->msgnumber), CS_ORIGIN(errmsg->msgnumber)); strcat(szErrorMsg,szError); sprintf(szError, "SEVERITY = (%ld) NUMBER = (%ld)\n", CS_SEVERITY(errmsg->msgnumber), CS_NUMBER(errmsg->msgnumber)); strcat(szErrorMsg,szError); sprintf(szError, "消息正文: %s\n", errmsg->msgstring); strcat(szErrorMsg,szError); if (errmsg->osstringlen > 0) { sprintf(szError, "操作系统错误: %s\n", errmsg->osstring); strcat(szErrorMsg,szError); } #ifdef WIN32 MessageBeep(MB_ICONHAND); AfxMessageBox(szErrorMsg);#else printf("%s\n", szErrorMsg);#endif return CS_SUCCEED;}/*--------------------------------------------------------------函数名:ServerMsgHandler描述:当服务器传送消息给Client-Library时调用该函数*/CS_INT ServerMsgHandler(CS_CONTEXT* pContext,CS_CONNECTION* pConnection, CS_SERVERMSG* srvmsg){ char szErrorMsg[1024]; char szError[512]; szErrorMsg[0] =0; sprintf(szError, "\nSybase 服务器消息:\n"); strcat(szErrorMsg,szError); sprintf(szError, "消息号: %ld, Severity %ld, ", srvmsg->msgnumber, srvmsg->severity); strcat(szErrorMsg,szError); sprintf(szError, "State %ld, Line %ld\n", srvmsg->state, srvmsg->line); strcat(szErrorMsg,szError); if (srvmsg->svrnlen > 0) { sprintf(szError, "服务器名 '%s'\n", srvmsg->svrname); strcat(szErrorMsg,szError); } if (srvmsg->proclen > 0) { sprintf(szError, " 过程 '%s'\n", srvmsg->proc); strcat(szErrorMsg,szError); } sprintf(szError, "消息正文: %s\n", srvmsg->text); strcat(szErrorMsg,szError); #ifdef WIN32 MessageBeep(MB_ICONHAND); AfxMessageBox(szErrorMsg);#else printf("%s\n", szErrorMsg);#endif return CS_SUCCEED;}/*--------------------------------------------------------------函数名:CommonMsgHandler描述:在CS-Library 函数发生错误时调用该函数*/CS_INT CommonMsgHandler(CS_CONTEXT*pContext , CS_CLIENTMSG* errmsg){ return ClientMsgHandler(pContext,NULL,errmsg);}CS_RETCODE DB_HandleResults(CDatabase *pDatabase, CS_COMMAND *pCmd){ CS_RETCODE nRetCode; CS_INT nResultType; CS_DATAFMT fmtStatus; /* ** 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 */ 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;}BOOL DB_ExecuteDynamicSQL(CDatabase *pDatabase, char *pSQL, 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; struct tm tm_t; CDateTime time; time_t tt; rc = ct_cmd_alloc(pDatabase->m_pConnection, &pCommand); RETURN_IF(pDatabase, rc, "Sybase DB_Open Client 分配命令结构指针失败!"); rc = ct_dynamic(pCommand, CS_PREPARE, "my_dynamic_sql", CS_NULLTERM, (CS_CHAR*)pSQL, CS_NULLTERM); if(rc != CS_SUCCEED) goto FAILURE; rc = ct_send(pCommand); if(rc != CS_SUCCEED) goto FAILURE; rc = DB_HandleResults(pDatabase, pCommand); if(rc != CS_SUCCEED) goto FAILURE; rc = ct_dynamic(pCommand, CS_EXECUTE, "my_dynamic_sql", CS_NULLTERM, NULL, CS_UNUSED); if(rc != CS_SUCCEED) goto FAILURE; 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, "Sybase DB_Open Client 动态SQL参数类型不支持!"); 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) goto FAILURE; rc = ct_dynamic(pCommand, CS_DEALLOC, "my_dynamic_sql", CS_NULLTERM, NULL, CS_UNUSED); if(rc != CS_SUCCEED) goto FAILURE; rc = ct_send(pCommand); if(rc != CS_SUCCEED) goto FAILURE; DB_HandleResults(pDatabase, pCommand); ct_cmd_drop(pCommand); return TRUE;FAILURE: DB_SetLastError(pDatabase, "Sybase DB_Open Client 函数ct_dynamic(CS_PREPARE)执行失败!"); ct_cmd_drop(pCommand); return FALSE;}BOOL DB_ConvertNumericToLong(CDatabase *pDatabase, CS_NUMERIC *npSrc, long* lpDest, int nPrecision, int nScale){ CS_DATAFMT fmtSrc; CS_DATAFMT fmtDest; CS_RETCODE nRetCode; memset(&fmtSrc, 0, sizeof(CS_DATAFMT)); fmtSrc.datatype = CS_NUMERIC_TYPE; fmtSrc.scale = nScale; fmtSrc.precision = nPrecision; memset(&fmtDest, 0, sizeof(CS_DATAFMT)); fmtDest.datatype = CS_INT_TYPE; fmtDest.maxlength = sizeof(CS_INT); nRetCode = cs_convert(pDatabase->m_pContext, &fmtSrc, npSrc, &fmtDest, lpDest, NULL); return(nRetCode == CS_SUCCEED);}BOOL DB_ConvertNumericToDouble(CDatabase *pDatabase, CS_NUMERIC *npSrc, double* lpDest, int nPrecision, int nScale){ CS_DATAFMT fmtSrc; CS_DATAFMT fmtDest; CS_RETCODE nRetCode; memset(&fmtSrc, 0, sizeof(CS_DATAFMT)); fmtSrc.datatype = CS_NUMERIC_TYPE; fmtSrc.scale = nScale; fmtSrc.precision = nPrecision; memset(&fmtDest, 0, sizeof(CS_DATAFMT)); fmtDest.datatype = CS_FLOAT_TYPE; fmtDest.maxlength = sizeof(CS_INT); nRetCode = cs_convert(pDatabase->m_pContext, &fmtSrc, npSrc, &fmtDest, lpDest, NULL); return(nRetCode == CS_SUCCEED);}/*************************************************** * 函数名:ExecuteStoreProcedure * 功能: 执行存储过程,支持输入任意个参数 * 返回值:成功--TRUE 失败--FALSE */BOOL DB_ExecuteStoredProcedure(CDatabase *pDatabase, char *pRpcName, int* npStatus, 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -