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

📄 database_op.c

📁 当前不少单位在进行系统改造升级时
💻 C
📖 第 1 页 / 共 4 页
字号:
		dbproc->rownum =  dbproc->rowindex + 1 ;

		for (i = 0; i < select_dp->F; i++)
		{
			/*char title[MAX_VNAME_LEN]; */
			/* Turn off high-order bit of datatype (in this example, it does not matter if the column is NOT NULL). */
			sqlnul ((unsigned short *)&(select_dp->T[i]), (unsigned short *)&(select_dp->T[i]), &null_ok);

			/*
			VARCHAR2 1 char[n]
			NUMBER 2 char[n] ( n <= 22)
			INTEGER 3 int
			FLOAT 4 float
			STRING 5 char[n+1]
			VARNUM 6 char[n] (n <= 22)
			DECIMAL 7 float
			LONG 8 char[n]
			VARCHAR 9 char[n+2]
			ROWID 11 char[n]
			DATE 12 char[n]
			VARRAW 15 char[n]
			RAW 23 unsigned char[n]
			LONG RAW 24 unsigned char[n]
			UNSIGNED 68 unsigned int
			DISPLAY 91 char[n]
			LONG VARCHAR 94 char[n+4]
			LONG VARRAW 95 unsigned char[n+4]
			CHAR 96 char[n]
			CHARF 96 char[n]
			CHARZ 97 char[n+1]			
			*/
			switch (select_dp->T[i])
			{
				case  1 : /* CHAR datatype: no change in length needed, except possibly for TO_CHAR conversions (not handled here). */
					break;
				case  2 : /* NUMBER datatype: use sqlprc() to extract precision and scale. */
					sqlprc ((unsigned long *)&(select_dp->L[i]), &precision, &scale);
						  /* Allow for maximum size of NUMBER. */
					if (precision == 0) precision = 40;
						  /* Also allow for decimal point and possible sign. */
					/* convert NUMBER datatype to FLOAT if scale > 0,INT otherwise. */
					if (scale > 0)	select_dp->L[i] = sizeof(float);
					else			select_dp->L[i] = sizeof(int);
					break;

				case  8 : /* LONG datatype */
					select_dp->L[i] = 240;
					break;
				case 11 : /* ROWID datatype */
				case 104 : /* Universal ROWID datatype */
					select_dp->L[i] = 18;
					break;

				case 12 : /* DATE datatype */
					select_dp->L[i] = 9;
					break;

				case 23 : /* RAW datatype */
					break;

				case 24 : /* LONG RAW datatype */
					select_dp->L[i] = 240;
					break;
			}
			/* Allocate space for the select-list data values.sqlald() reserves a pointer location for V[i] but does not allocate the full space for the pointer.  */
			 if (select_dp->T[i] != 2)
			 {
			   select_dp->V[i] = (char *) realloc(select_dp->V[i],
										select_dp->L[i] + 1);  
			 }
			 else
			   select_dp->V[i] = (char *) realloc(select_dp->V[i],
										select_dp->L[i]);  

			/* Print column headings, right-justifying number column headings. */
    
			/* Copy to temporary buffer in case name is null-terminated */
/*				strncpy(title, select_dp->S[i], select_dp->C[i]);

			if (select_dp->T[i] == 2)
			   if (scale > 0)
				 printf ("%.*s ", select_dp->L[i]+3, title);
			   else
				 printf ("%.*s ", select_dp->L[i], title);
			else
			  printf("%-.*s ", select_dp->L[i], title);
*/
			/* Coerce ALL datatypes except for LONG RAW and NUMBER to character. */
			if (select_dp->T[i] != 24 && select_dp->T[i] != 2)	select_dp->T[i] = 1;

			/* Coerce the datatypes of NUMBERs to float or int depending on the scale. */
			if (select_dp->T[i] == 2)
			{
			  if (scale > 0)
				 select_dp->T[i] = 4;  /* float */
			  else
				 select_dp->T[i] = 3;  /* int */
			}
		}
	}
	
	return SUCCEED ;
}


/*
该函数判断数据库返回结果,操作DBPROC_STR的特定字段
SUCCEED  NO_MORE_RESULTS
*/

RETCODE dbresults	(DBPROC_STR *dbproc)
{
	if( NULL == dbproc ) return NO_MORE_RESULTS;
	
	if( dbproc->sqlerror < 0 ) return NO_MORE_RESULTS ;

	if( dbproc->rowindex != dbproc->rownum ) return SUCCEED ;

	return NO_MORE_RESULTS ;

}


/*
绑定值,绑定存储值的位子
 */
RETCODE dbbind		(DBPROC_STR *dbproc,int colnum,int vartype,DBINT varlen,BYTE *destvar)
{
	if( colnum <= 0 ) return FAIL ;
	if( colnum > dbproc->colnum ) return FAIL ;
	if( colnum >= MAXPOINTNUM ) return FAIL ;

	

	/*
	 当前仅支持此类型
	 */
	if( NTBSTRINGBIND != vartype )
	{
		printf("\n!!!!!!!!!!!!!UNKNOWN TYPE  %d  !!!!!!!!\n\n",vartype);
		exit(0);/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   */
	}




	dbproc->ppbuff[colnum - 1 ]	= destvar ;
	dbproc->pbufftype[colnum - 1 ] = vartype ;
	
	return FAIL ;
}

/*
获得本次执行返回多少列
 */
int dbnumcols		(DBPROC_STR *dbproc)
{
	return dbproc->colnum ;
}


/*
将下一条值赋值到绑定的变量上
 */
STATUS dbnextrow	(DBPROC_STR *dbprocess)
{
	int i ;

	if( NULL == dbprocess ) return NO_MORE_ROWS ;

	/* FETCH each row selected and print the column values. */
	/* EXEC SQL CONTEXT USE :dbprocess->ctx; */ 

	/* EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop; */ 

	
	/* EXEC SQL CONTEXT USE :dbprocess->ctx; */ 

	/* EXEC SQL AT :dbprocess->connName  FETCH CCC USING DESCRIPTOR select_dp; */ 

{
 struct sqlexd sqlstm;
 sqlstm.sqlvsn = 12;
 sqlstm.arrsiz = 5;
 sqlstm.sqladtp = &sqladt;
 sqlstm.sqltdsp = &sqltds;
 sqlstm.iters = (unsigned int  )1;
 sqlstm.offset = (unsigned int  )330;
 sqlstm.selerr = (unsigned short)1;
 sqlstm.cud = sqlcud0;
 sqlstm.sqlest = (unsigned char  *)&sqlca;
 sqlstm.sqlety = (unsigned short)256;
 sqlstm.occurs = (unsigned int  )0;
 sqlstm.sqfoff = (           int )0;
 sqlstm.sqfmod = (unsigned int )2;
 sqlstm.sqhstv[0] = (         void  *)select_dp;
 sqlstm.sqhstl[0] = (unsigned int  )0;
 sqlstm.sqhsts[0] = (         int  )0;
 sqlstm.sqindv[0] = (         void  *)0;
 sqlstm.sqinds[0] = (         int  )0;
 sqlstm.sqharm[0] = (unsigned int  )0;
 sqlstm.sqadto[0] = (unsigned short )0;
 sqlstm.sqtdso[0] = (unsigned short )0;
 sqlstm.sqhstv[1] = (         void  *)(dbprocess->connName);
 sqlstm.sqhstl[1] = (unsigned int  )20;
 sqlstm.sqhsts[1] = (         int  )0;
 sqlstm.sqindv[1] = (         void  *)0;
 sqlstm.sqinds[1] = (         int  )0;
 sqlstm.sqharm[1] = (unsigned int  )0;
 sqlstm.sqadto[1] = (unsigned short )0;
 sqlstm.sqtdso[1] = (unsigned short )0;
 sqlstm.sqphsv = sqlstm.sqhstv;
 sqlstm.sqphsl = sqlstm.sqhstl;
 sqlstm.sqphss = sqlstm.sqhsts;
 sqlstm.sqpind = sqlstm.sqindv;
 sqlstm.sqpins = sqlstm.sqinds;
 sqlstm.sqparm = sqlstm.sqharm;
 sqlstm.sqparc = sqlstm.sqharc;
 sqlstm.sqpadto = sqlstm.sqadto;
 sqlstm.sqptdso = sqlstm.sqtdso;
 sqlcxt(&(dbprocess->ctx), &sqlctx, &sqlstm, &sqlfpn);
 if (sqlca.sqlcode == 1403) goto end_select_loop;
}


	
	/* Since each variable returned has been coerced to a character string, int, or float very little processing is required here.  This routine just prints out the values on the terminal. */
	for (i = 0; i < select_dp->F; i++)
	{
		if( NULL == dbprocess->ppbuff[i] ) continue ;

		if (*select_dp->I[i] < 0)
		{
			switch(dbprocess->pbufftype[i]) 
			{
			case NTBSTRINGBIND :
				/*
							if (select_dp->T[i] == 4) 
								sprintf ("%-*c ",(int)select_dp->L[i]+3, ' ');
							else
								printf ("%-*c ",(int)select_dp->L[i], ' ');
				*/
				strcpy(dbprocess->ppbuff[i],"");
				break;

			case CHARBIND:
				*((char*)dbprocess->ppbuff[i]) = 0 ;
				break ;
			
			case INTBIND:
				*((int*)dbprocess->ppbuff[i]) = 0 ;
				break ;
				
			default:
				/*
				 *	ERROR ! not support type!
				 */
				dbprocess->sqlerror = -50001;
				return NO_MORE_ROWS ;
			}
		}
		else
		{
			switch(dbprocess->pbufftype[i]) 
			{
			case NTBSTRINGBIND :
				if (select_dp->T[i] == 3)     /* int datatype */
					sprintf (dbprocess->ppbuff[i],"%*d", (int)select_dp->L[i], *(int *)select_dp->V[i]);
				else if (select_dp->T[i] == 4)     /* float datatype */
					sprintf (dbprocess->ppbuff[i],"%*.2f", (int)select_dp->L[i], *(float *)select_dp->V[i]);
				else                          /* character string */
					sprintf (dbprocess->ppbuff[i],"%-*.*s", (int)select_dp->L[i],(int)select_dp->L[i], select_dp->V[i]);
				break;
			case CHARBIND:
				*((char*)dbprocess->ppbuff[i]) = *(char*) select_dp->V[i] ;
				break ;
			
			case INTBIND:
				*((int*)dbprocess->ppbuff[i]) = *(int*) select_dp->V[i] ;
				break ;
				
			default:
				/*
				 *	ERROR ! not support type!
				 */
				dbprocess->sqlerror = -50001;
				return NO_MORE_ROWS ;
			}
		}
	}

	return SUCCEED ;
	
end_select_loop :
	dbprocess->rownum = dbprocess->rowindex ;
	
	return NO_MORE_ROWS ;
}


/*
判断该连接是否正常
 */
DBBOOL	dbdead		(DBPROC_STR *a)
{
	char chbuff[8];	
	
	chbuff[0]='\0';

	/* EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop; */ 

	/* EXEC SQL CONTEXT USE :a->ctx; */ 

	/* EXEC SQL AT :a->connName SELECT 'A' INTO :chbuff FROM DUAL ; */ 

{
 struct sqlexd sqlstm;
 sqlstm.sqlvsn = 12;
 sqlstm.arrsiz = 5;
 sqlstm.sqladtp = &sqladt;
 sqlstm.sqltdsp = &sqltds;
 sqlstm.stmt = "select 'A' into :b1  from DUAL ";
 sqlstm.iters = (unsigned int  )1;
 sqlstm.offset = (unsigned int  )353;
 sqlstm.selerr = (unsigned short)1;
 sqlstm.cud = sqlcud0;
 sqlstm.sqlest = (unsigned char  *)&sqlca;
 sqlstm.sqlety = (unsigned short)256;
 sqlstm.occurs = (unsigned int  )0;
 sqlstm.sqhstv[0] = (         void  *)chbuff;
 sqlstm.sqhstl[0] = (unsigned int  )8;
 sqlstm.sqhsts[0] = (         int  )0;
 sqlstm.sqindv[0] = (         void  *)0;
 sqlstm.sqinds[0] = (         int  )0;
 sqlstm.sqharm[0] = (unsigned int  )0;
 sqlstm.sqadto[0] = (unsigned short )0;
 sqlstm.sqtdso[0] = (unsigned short )0;
 sqlstm.sqhstv[1] = (         void  *)(a->connName);
 sqlstm.sqhstl[1] = (unsigned int  )20;
 sqlstm.sqhsts[1] = (         int  )0;
 sqlstm.sqindv[1] = (         void  *)0;
 sqlstm.sqinds[1] = (         int  )0;
 sqlstm.sqharm[1] = (unsigned int  )0;
 sqlstm.sqadto[1] = (unsigned short )0;
 sqlstm.sqtdso[1] = (unsigned short )0;
 sqlstm.sqphsv = sqlstm.sqhstv;
 sqlstm.sqphsl = sqlstm.sqhstl;
 sqlstm.sqphss = sqlstm.sqhsts;
 sqlstm.sqpind = sqlstm.sqindv;
 sqlstm.sqpins = sqlstm.sqinds;
 sqlstm.sqparm = sqlstm.sqharm;
 sqlstm.sqparc = sqlstm.sqharc;
 sqlstm.sqpadto = sqlstm.sqadto;
 sqlstm.sqptdso = sqlstm.sqtdso;
 sqlcxt(&(a->ctx), &sqlctx, &sqlstm, &sqlfpn);
 if (sqlca.sqlcode == 1403) goto end_select_loop;
}


	
	if ('A' != chbuff[0]) 
	{
		return FAIL ;
	}
	return SUCCEED ;
end_select_loop:
	return FAIL ;
}


/*
该函数释放dbopen产生的内存,同时断开数据库连接
需要进一步的考虑!

*/
void dbexit			(void)
{
	int i,iLen ,iIndex ;

    /* EXEC SQL WHENEVER SQLERROR CONTINUE; */ 

	
	iLen = sizeof(AllOpenProcess)/sizeof(DBPROC_STR * );
	
	for ( iIndex = 0 ; iIndex < iLen ; iIndex ++ )
	{
		if( NULL != AllOpenProcess[iIndex] ) 
		{

/*
 *	此处开始断开数据库连接!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 */
			/* EXEC SQL CONTEXT USE : AllOpenProcess[iIndex]->ctx; */ 

			/* EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop; */ 

			
			/* Close the cursor. */
			/* EXEC SQL AT :AllOpenProcess[iIndex]->connName CLOSE CCC; */ 

{
   struct sqlexd sqlstm;
   sqlstm.sqlvsn = 12;
   sqlstm.arrsiz = 5;
   sqlstm.sqladtp = &sqladt;
   sqlstm.sqltdsp = &sqltds;
   sqlstm.iters = (unsigned int  )1;
   sqlstm.offset = (unsigned int  )376;
   sqlstm.cud = sqlcud0;
   sqlstm.sqlest = (unsigned char  *)&sqlca;
   sqlstm.sqlety = (unsigned short)256;
   sqlstm.occurs = (unsigned int  )0;
   sqlstm.sqhstv[0] = (         void  *)(AllOpenProcess[iIndex]->connName);
   sqlstm.sqhstl[0] = (unsigned int  )20;
   sqlstm.sqhsts[0] = (         int  )0;
   sqlstm.sqindv[0] = (         void  *)0;
   sqlstm.sqinds[0] = (         int  )0;
   sqlstm.sqharm[0] = (unsigned int  )0;
   sqlstm.sqadto[0] = (unsigned short )0;
   sqlstm.sqtdso[0] = (unsigned short )0;
   sqlstm.sqphsv = sqlstm.sqhstv;
   sqlstm.sqphsl = sqlstm.sqhstl;
   sqlstm.sqphss = sqlstm.sqhsts;
   sqlstm.sqpind = sqlstm.sqindv;
   sqlstm.sqpins = sqlstm.sqinds;
   sqlstm.sqparm = sqlstm.sqharm;
   sqlstm.sqparc = sqlstm.sqharc;
   sqlstm.sqpadto = sqlstm.sqadto;
   sqlstm.sqptdso = sqlstm.sqtdso;
   sqlcxt(&(AllOpenProcess[iIndex]->ctx), &sqlctx, &sqlstm, &sqlfpn);
}


			
			/* EXEC SQL AT :AllOpenProcess[iIndex]->connName COMMIT WORK RELEASE; */ 

{
   struct sqlexd sqlstm;
   sqlstm.sqlvsn = 12;
   sqlstm.arrsiz = 5;
   sqlstm.sqladtp = &sqladt;
   sqlstm.sqltdsp = &sqltds;
   sqlstm.iters = (unsigned int  )1;
   sqlstm.offset = (unsigned int  )395;
   sqlstm.cud = sqlcud0;
   sqlstm.sqlest = (unsigned char  *)&sqlca;
   sqlstm.sqlety = (unsigned short)256;
   sqlstm.occurs = (unsigned int  )0;
   sqlstm.sqhstv[0] = (         void  *)(AllOpenProcess[iIndex]->connName);
   sqlstm.sqhstl[0] = (unsigned int  )20;
   sqlstm.sqhsts[0] = (         int  )0;
   sqlstm.sqindv[0] = (         void  *)0;
   sqlstm.sqinds[0] = (         int  )0;
   sqlstm.sqharm[0] = (unsigned int  )0;
   sqlstm.sqadto[0] = (unsigned short )0;
   sqlstm.sqtdso[0] = (unsigned short )0;
   sqlstm.sqphsv = sqlstm.sqhstv;
   sqlstm.sqphsl = sqlstm.sqhstl;
   sqlstm.sqphss = sqlstm.sqhsts;
   sqlstm.sqpind = sqlstm.sqindv;
   sqlstm.sqpins = sqlstm.sqinds;
   sqlstm.sqparm = sqlstm.sqharm;
   sqlstm.sqparc = sqlstm.sqharc;
   sqlstm.sqpadto = sqlstm.sqadto;
   sqlstm.sqptdso = sqlstm.sqtdso;
   sqlcxt(&(AllOpenProcess[iIndex]->ctx), &sqlctx, &sqlstm, &sqlfpn);
}


			
			free(AllOpenProcess[iIndex]);
			AllOpenProcess[iIndex] = NULL ;
		}
	}


	if( select_dp )
	{
		for (i = 0; i < MAXPOINTNUM; i++)
		{    
			if (select_dp->V[i] != (char *) 0)
				free(select_dp->V[i]);
			free(select_dp->I[i]); /* MAXPOINTNUM were allocated. */
		}
		
		/* Free space used by the descriptors themselves. */
		sqlclu(select_dp);

		select_dp = NULL ;
	}
	
	
    return;

}



















#endif

#ifdef MSSQL_PLATFORM
#endif



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -