⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sybasedb.c

📁 电力与银行通讯的源码 1.应用tuxedo中间件. 2.与银行的前置机通讯. 3.proc*c 的应用
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -