要先从filename文件里面取出一行,按照|分割好后,字段分别插入数据库里面。部分源代码如下:
void indestination(char *filename_dest)
{
    EXEC SQL BEGIN DECLARE SECTION;
        char csql[1024];
        int sdest_id;
        char dest_name[100];
        int scarr_id;
        int scount_id;
        char count_code[8];
        char dcode[4000] ;
        char cal_type[2];
        int sserv_type;
        int seff_date;
        int sexp_date;
        int sup_date;
        char up_by[30];
        long long sirm_dest_id;
        char commt[255];   
     EXEC SQL END DECLARE SECTION;
char dest_id[10],carr_id[6],count_id[6],serv_type[4], eff_date[9], exp_date[9], up_date[9], irm_dest_id[11];
char getstr[STR_SIZE],errMsg[1024];
FILE *fp_filename;
char *p;

 
         memset(errMsg,0,1024);
memset(csql,0,1024);  
memset(getstr,0,STR_SIZE);
if((fp_filename=fopen(filename_dest,"r"))==NULL)
perror("fopen");

sprintf(csql,"%s INSERT INTO DESTINATION(DESTINATION_ID,DESTINATION_NAME,CARRIER_ID,COUNTRY_ID,COUNTRY_CODE,DIALCODE,CALLEE_TYPE,SERVICE_TYPE,EFFECT_DATE,EXPIRE_DATE,UPDATE_DATE,UPDATE_BY,IRM_DESTINATION_ID,COMMENTS) ",csql);
sprintf(csql,"%s VALUES(:v1,:v2,:v3,:v4,:v5,:v6,:v7,:v8,:v9,:v10,:v11,v12.:v13,:v14)",csql);
         fgets(getstr,STR_SIZE,fp_filename);
   
  


  while ( !feof(fp_filename ))
  {
   memset(dest_id,0,10);
   memset(dest_name,0,100+1);
   memset(carr_id,0,6);
   memset(count_id,0,6);
   memset(count_code,0,8+1);
   memset(dcode,0,4000+1) ;
   memset(cal_type,0,2);
   memset(serv_type,0,4);
   memset(eff_date,0,9);
   memset(exp_date,0,9);
   memset(up_date,0,9);
   memset(up_by,0,30+1);
   memset(irm_dest_id,0,11);
   memset(commt,0,255+1);
  
   if ((p=strtok(getstr,"|"))!= NULL)
       strcpy(dest_id,p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(dest_name , p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(carr_id,p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(count_id , p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(count_code,p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(dcode , p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(cal_type,p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(serv_type , p);
   if ((p=strtok(NULL,"|"))!= NULL)
     strcpy( eff_date , p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(exp_date,p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(up_date,p);
   if ((p=strtok(NULL,"|"))!= NULL)
       strcpy(up_by,p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(irm_dest_id , p);
   if ((p=strtok(NULL,"|"))!= NULL)
      strcpy(commt,p);
      
   sdest_id=atoi(dest_id);
   scarr_id=atoi(carr_id);
   scount_id=atoi(count_id);
   sserv_type=atoi(serv_type);
   seff_date=atoi(eff_date);
   sexp_date=atoi(exp_date);
   sup_date=atoi(up_date);
   sirm_dest_id=atoi(irm_dest_id);
   
   EXEC SQL PREPARE S FROM :csql;
   EXEC SQL EXECUTE S using :sdest_id,:dest_name,:scarr_id,:scount_id,:count_code,:dcode,:cal_type[0],:sserv_type,:seff_date,:sexp_date,:sup_date,:up_by,:sirm_dest_id,:commt;
   if (sqlca.sqlcode!=0)
      {
        sprintf( errMsg,"insert error:%s,sqlca.sqlcode=%d",sqlca.sqlerrm.sqlerrmc,sqlca.sqlcode);
  fputs(errMsg, fp_log);
  printf( "%s",errMsg);
  return;
   } 查询的表格结构如下:
SQL> desc DESTINATION                                                
 Name                                      Null?    Type             
 ----------------------------------------- -------- -----------------
 DESTINATION_ID                            NOT NULL NUMBER(9)        
 DESTINATION_NAME                          NOT NULL VARCHAR2(100)    
 CARRIER_ID                                NOT NULL NUMBER(5)        
 COUNTRY_ID                                NOT NULL NUMBER(5)        
 COUNTRY_CODE                                       VARCHAR2(8)      
 DIALCODE                                           VARCHAR2(4000)   
 CALLEE_TYPE                               NOT NULL CHAR(1)          
 SERVICE_TYPE                              NOT NULL NUMBER(3)        
 EFFECT_DATE                               NOT NULL NUMBER(8)        
 EXPIRE_DATE                               NOT NULL NUMBER(8)        
 UPDATE_DATE                               NOT NULL NUMBER(8)        
 UPDATE_BY                                 NOT NULL VARCHAR2(30)     
 IRM_DESTINATION_ID                                 NUMBER(10)       
 COMMENTS                                           VARCHAR2(255)    要插入的第一行数据:
240000|PAKISTAN CELLULAR PAKTEL|140|30|92|31|1|-1|20100801|20110201|20110131|admin|1505605|  
   

解决方案 »

  1.   

    sirm_dest_id=atoi(irm_dest_id);改成sirm_dest_id=atol(irm_dest_id);还是报一样的错误
      

  2.   

    确定执行的SQL语句中的所有变量都已经赋值了吗
      

  3.   

    确定赋值了,而且内容和240000|PAKISTAN CELLULAR PAKTEL|140|30|92|31|1|-1|20100801|20110201|20110131|admin|1505605|是一样的。
      

  4.   

    找到原因了是sprintf(csql,"%s VALUES(:v1,:v2,:v3,:v4,:v5,:v6,:v7,:v8,:v9,:v10,:v11,v12.:v13,:v14)",csql);
    里面的v12.写错了应该是“,”。