Skip to content

批量数据入库

由XGCIExecDirectBatch()和XGCIBindParamArrayByPos()函数的组合使用实现。

...
int i,j;
int field_num =6;
int param_num =6;
int array_num=10;//
int ret;
//c1 bool ,c2 tinyint, c3 smallint , c4 bigint, c5 float ,c6 binary
char * sql="insert into t_bindarray_2(C1,C2,C3,C4,C5,C6) values(?,?,?,?,?,?)";

int ** rp   =(int**)malloc(field_num*sizeof(int*));
int ** a_clen =(int**)malloc(field_num*sizeof(int*));
int  sqltype[6]={0}; 
int  ctypes[6]={0}; 
void** ptr_data =(void**)malloc(field_num*sizeof(void*));
int clen[6]={0};
ptr_data[0]= malloc(field_num*sizeof(bool));
a_clen[0]= (int*)malloc(sizeof(int)*array_num);
for( i=0;i<array_num;i++)
{
    if(i%2==0)
        ((bool*) ptr_data[0])[i]= true;
    else
        ((bool*) ptr_data[0])[i]= false;
    a_clen[0][i] = sizeof(bool);
}
clen[0]=2;
ctypes[0]=Xugu_C_BOOL ;
sqltype[0]=SQL_BOOL ;
a_clen[1]= (int*)malloc(sizeof(int)*array_num);
ptr_data[1]= malloc(array_num*sizeof(char));
for( i=0;i<array_num;i++)
{
    ((char*) ptr_data[1])[i]=i+35;
    a_clen[1][i] = 1;
}
clen[1]=1;
ctypes[1]=Xugu_C_TINYINT ;
sqltype[1]=SQL_TINYINT ;

a_clen[2]= (int*)malloc(sizeof(int)*array_num);
ptr_data[2]= malloc(array_num*sizeof(short));
for( i=0;i<array_num;i++)
{
    ((short*) ptr_data[2])[i]=i+2001;
    a_clen[2][i] = 2;
}
clen[2]=2;
ctypes[2]=Xugu_C_SHORT ;
sqltype[2]=SQL_SMALLINT ;

a_clen[3]= (int*)malloc(sizeof(int)*array_num);
ptr_data[3]= malloc(array_num*sizeof(int64));
for( i=0;i<array_num;i++)
{
    ((int64*) ptr_data[3])[i]=35+i+9988822000000;
    a_clen[3][i] = 8;
}
clen[3]=8;
ctypes[3]=Xugu_C_BIGINT ;
sqltype[3]=SQL_BIGINT ;
a_clen[4]= (int*)malloc(sizeof(int)*array_num);
ptr_data[4]= malloc(array_num*sizeof(float));
for( i=0;i<array_num;i++)
{
    ((float*) ptr_data[4])[i]= i+23823.222 ;
    a_clen[4][i] = 4;
}
clen[4]=4;
ctypes[4]=Xugu_C_FLOAT ;
sqltype[4]=SQL_FLOAT ;

ptr_data[5]= malloc(array_num*sizeof(char*)); 
a_clen[5]= (int*)malloc(sizeof(int)*array_num);
char * path =PATH_BBINARY ; 
FILE* fp= fopen(path,"rb");
for( i=0;i<array_num;i++)
{
    ((char**)ptr_data[5])[i]=(char*)malloc(200+10*i);
    int len = fread(((char**)ptr_data[5])[i] ,1,200+10*i,fp);
    a_clen[5][i] = len;
}
clen[5]=300;
ctypes[5]=Xugu_C_BINARY ;
sqltype[5]=SQL_BINARY ;

for (j=0;j<field_num;j++)
{
    rp[j]   =  (int*)malloc(sizeof(int)*array_num);  
    ret= XuguCIBindParamArrayByPos(connp->hdstmt,j+1,param_num,PARAM_IN,array_num,ptr_data[j],clen[j],ctypes[j],rp[j],a_clen[j],sqltype[j]);
    if(ret<0)
    {
        printf("bind column NO %d  error \n",j);
    }
}
int a_len =strlen(sql);
ret= XuguCIExecDirectBatch(connp->hdstmt,sql,a_len);
if (ret<0) 
{
    print_error(connp,ret,sql);
    return -1; 
} 
...
详见:demo1里面的 BulkInsert()函数