#include <stdio.h>#include <dbsql.h>#include <libgen.h>/*去掉传入的str右边的空格' '*/char *ltrim( char *str ){ int len ; len = strlen (str); while ( len > 0 && str[len -1 ] == ' ' ) { len --; } str[len] = '/0'; return str;}int main(int argc, char *argv[]){ HSTMT hstmt; /*#define HSTMT int*/ RETCODE rc; /*#define RETCODE int*/ char tmp[3],tmpstr[1024]; char tmpsql[1024],passwd[64],user[64],tablename[64],tablefile[128]; short int counts; int pcrow,i; int num,len; double tm1,tm2; FILE *fptr; int is_sql = 0 ;
if ( argc != 5 && argc != 6) { printf("Usage : %s user passwd tablename tablefile /n",basename(argv[0])); printf("Or Usage : %s -sql user passwd tablefile sqlstmt/n",basename(argv[0])); exit (-1); }
if ( argc == 5 ) /*如果是5个参数,则是到处整个tablename表数据*/ { len = strlen ( argv[1]); len = len >= 63 ? 63 : len; sprintf(user,"%*.*s",len,len,argv[1]);
len = strlen ( argv[2]); len = len >= 63 ? 63 : len; sprintf(passwd,"%*.*s",len,len,argv[2]);
len = strlen ( argv[3]); len = len >= 63 ? 63 : len; sprintf(tablename,"%*.*s",len,len,argv[3]);
len = strlen ( argv[4]); len = len >= 127 ? 127 : len; sprintf(tablefile,"%*.*s",len,len,argv[4]);
} else if ( argc == 6 && memcmp(argv[1],"-sql",4) == 0) /*如果是6位参数,并且第2个是"-sql"*/ { is_sql = 1; len = strlen ( argv[2]); len = len >= 63 ? 63 : len; sprintf(user,"%*.*s",len,len,argv[2]);
len = strlen ( argv[3]); len = len >= 63 ? 63 : len; sprintf(passwd,"%*.*s",len,len,argv[3]);
len = strlen ( argv[4]); len = len >= 127 ? 127 : len; sprintf(tablefile,"%*.*s",len,len,argv[4]);
memset(tablename,'/0',sizeof(tablename)); } else { printf("Usage : %s -sql user passwd tablefile sqlstmt/n",basename(argv[0])); exit (-1); }
tm1= get_milli_time(); printf(" /n/t正在倒表 %s ,请稍后... ... /n",tablename); fptr = fopen(argv[4],"w+t"); /*打开第5个文件参数文件*/ if (fptr == NULL) { printf("open output file %s error/n",tablefile); fflush(stdout); printf("/t倒出表 %s 失败./n",tablename); return -1; } SQLAllocEnv(0); /*初始化数据库环境*/ /*连接数据库*/ rc = SQLConnect( 0,(UCHAR *)"",0,(UCHAR *)user,0,(UCHAR *)passwd,0); if (rc != SQL_SUCCESS) { printf(" /t倒出表 %s 失败./n",tablename); return -1; } SQLAllocStmt(0,&hstmt); /*初始化数据库句柄*/ if (rc != SQL_SUCCESS) { printf("Alloc stmt is failed./n"); printf(" /t倒出表 %s 失败./n",tablename); fflush(stdout); return -1; } if ( 1 == is_sql ) { sprintf(tmpsql,"%s",argv[5]); } else { sprintf(tmpsql,"select * from %s",tablename ); } rc = SQLPrepare(hstmt,(UCHAR *)tmpsql,0); if (rc != SQL_SUCCESS) { printf("sql is %s/n",tmpsql); printf(" /t倒出表 %s 失败./n",tablename ); fflush(stdout); return -1; } rc = SQLExecute(hstmt); /*执行句柄*/ if (rc != SQL_SUCCESS) { printf("file is %s line is %d/n",__FILE__,__LINE__); printf(" /t倒出表 %s 失败./n",tablename ); fflush(stdout); return -1; } SQLNumResultCols( hstmt,( SWORD FAR *)&counts); num = 0; while (1) { rc = SQLFetch(hstmt); /*读取下一条记录*/ if (rc == SQL_SUCCESS ) { num ++; for ( i=0; i<counts; i++ ) { SQLGetData(hstmt,i+1,SQL_C_CHAR,tmpstr,1023,&pcrow); /*读取数据*/ fprintf(fptr,"%.*s|",pcrow,ltrim(tmpstr)); /*每个字段以"|"分隔*/ } fprintf(fptr,"/n"); } else { break; /*如果没有数据了就break,退出循环*/ } } fclose(fptr); /*关闭文件*/ tm2= get_milli_time();
printf("/t共有 %d 行被倒出,耗时: .4lf 秒/n/n" , num , tm2 - tm1); SQLFreeStmt( hstmt, SQL_DROP); /*释放句柄*/ SQLFreeEnv(0); /*释放数据库环境*/ return 0;}