2015-02-01 1 views
-1

C 프로그래밍을 사용하여 동일한 스키마로 두 SQL 데이터베이스를 병합하려고합니다. SQL을 처음 접했을 때 C 프로그래밍을 사용하여 병합하기 위해 아래 코드를 시도했습니다. 하지만 런타임시 SQL 문에서 파일 경로를 전달할 수 없기 때문에 병합하지 못했습니다. 아래의 SQL 문에서 파일 경로를 전달하여 병합 할 수있는 방법.C 프로그래밍을 사용하여 SQL 문에서 런타임에 파일 경로를 전달하는 방법

/두 DB를/

 rc = sqlite3_open(argv[1], &db); /*-----> argv[1] is old_student.db*/ 
     if(rc) 
     { 
      printf("Can't open database: %s\n", sqlite3_errmsg(db)); 
      exit(0); 
     } 
     else 
     { 
      printf("Opened database successfully\n"); 
     } 
     /*Create SQL statement to merge two DBs*/ 
     sql = "attach '<file_path_name>' as toMerge;\ /*--------> how to pass file path here in runtime */ 
       BEGIN;\ 
       insert or ignore into student_table (Name, AGE, Address)\ 
       select Name, AGE, Address from toMerge.student_table;\ 
       COMMIT;"; 
     /* Execute SQL statement */ 
     rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); 
     if(rc != SQLITE_OK) 
     { 
      printf("SQL error: %s\n", zErrMsg); 
      sqlite3_free(zErrMsg); 
     } 
     else 
     { 
      printf("%s merged New_student.db successfully with old_student.db\n"); 
     } 
     sqlite3_close(db); 

제가 런타임에 SQL 문에서 매개 변수를 전달하는 방법을 알려주세요 을 병합 SQL 문을 작성합니다. 귀하의 도움을 매우 높이 평가하겠습니다.

미리 감사드립니다.

답변

0

이 배열은 sql 배열을 VLA으로 선언 한 다음 sprintf을 사용하여 아래와 같이 쿼리를 구성하여 수행 할 수 있습니다.

static const char *prefix = "attach '"; 
static const char *suffix = 
    "' as toMerge;" 
    " BEGIN;" 
    " insert or ignore into student_table (Name, AGE, Address)" 
    " select Name, AGE, Address from toMerge.student_table;" 
    " COMMIT;"; 

int length = strlen(prefix) + strlen(argv[1]) + strlen(suffix) + 1; 
char sql[length]; 
sprintf(sql, "%s%s%s", prefix, argv[1], suffix); 
+0

감사합니다. –

관련 문제