2009-10-26 2 views
1

나는 다음과 같은 코드가 있습니다C API를 사용하여 SQLite3 가져 오기 명령을 사용하려면 어떻게해야합니까?

near ".": syntax error 

내가 가져 오기 명령을 인식하지 못하는 가정이 실행됩니다 후

int rc; 
rc = sqlite3_exec(sqlite3_database, ".import mydata.csv mytable", callback, 0, &errMsg); 

을 errmsg를이 오류 메시지가 포함되어 있습니다. 그러나이 명령은 명령 줄의 sqlite3 프로그램에서 실행할 때 작동합니다.

내 프로그램에서 직접 가져 오기 명령을 사용할 수 있어야합니다. 내가 할 수있는 방법이 있니? 가져 오기 명령을 사용해야하는 이유는 CSV 파일의 각 행에 대한 삽입 작업을 5 분 이상 수행하고 가져 오기 명령을 초 단위로 수행하기 때문입니다.

+0

을 통해 액세스 할 수 있습니다. 관련 질문 및 이에 대한 후속 답변이 있습니다 (iPhone과 관련 없음). [http://stackoverflow.com/questions/364017/faster-bulk-inserts-in-sqlite3] (http://stackoverflow.com/questions/364017/faster-bulk-inserts-in-sqlite3) –

답변

2

.import는 내가 믿는 C API가 아닌 명령 줄 프로그램 인터페이스의 일부입니다. 당신은 (내가 한 것처럼) 다른 도구를 사용하여 SQLite3 데이터베이스 파일에 모든 데이터를 설정 한 다음 해당 데이터베이스 파일을 앱에 포함시킬 수 있습니다. 그런 다음 코드에서 열면 데이터가 이미 있습니다.

+0

prpogram은 미리로드 된 sqlite3 데이터베이스 파일을 사용하기 시작합니다. 문제는 업데이트 기능을 만들고 CSV 파일을 다운로드 할 수있는 업데이트 프로그램의 일부입니다. –

+0

알겠습니다. 명확히 해 주셔서 감사합니다. 아직이 코드는 다루지 않았지만 CSV 업데이트를 다운로드하고 다른 스레드에서 한 번에 한 줄씩 실제 업데이트를 실행하는 것을 고려하고있었습니다. –

+0

PHP를 사용하여 서버에서 SQLite 데이터베이스를 생성했습니다. 준비된 명령문을 수동으로 작성하고 각 행을 삽입하면 빠른 서버에서도 오랜 시간이 걸립니다. 그러나 PHP의 proc_open 명령을 사용하여 sqlite3과 인터페이스 할 수 있었으며 ".import"명령을 사용할 수있었습니다. 이렇게하면 파일이 초 단위로 생성되고 HTTP를 통해 파일을 출력하고 iPhone의 응용 프로그램 쓰기 가능 디렉토리에 파일을 저장하면 응용 프로그램에서 문제없이 파일을 사용할 수 있습니다. –

7

명령 줄 셸의 .import은 C API의 일부가 아닙니다. sqlite3 도구는

sqlite3_prepare(..., "INSERT INTO '...' VALUES (?, ..., ?)", ...); 
sqlite3_exec(..., "BEGIN", ...); 
for (each entry) { 
    for (each column) sqlite3_bind_text(..., column, ...); 
    sqlite3_step(...); 
} 
sqlite3_exec(..., "COMMIT", ...); 
일부 오류 검사와

(ROLLBACK 아무것도 잘못되면)와 준비된 명령문 (sqlite3_reset, sqlite3_finalize를) 처리로 구현합니다.

1

나는 삽입은 각 행에 대한 INSERT 문을 재분석 그래서 당신이 SQLite는 가지고 있기 때문에 복용 의심이 아니라 매개 변수화 된 준비된 문을 사용하여 (즉 sqlite3_exec()를 사용한다) (즉 sqlite3_prepare_v2(), sqlite_bind_*()sqlite3_step()를 사용한다) . 위에서 언급 한 것처럼 수입은 내부적으로 구현됩니다.

매개 변수화 된 명령문을 사용하면 .import와 동일한 성능을 달성해야한다고 생각합니다.

+0

나는 sqlite3_reset과 sqlite3_finalize도 사용하고있었습니다. 그들은 작동하지만 iPhone Simulator를 사용하여 55 초가 걸리지 만 실제 iPhone에서는 5 분 이상 걸립니다. –

+1

@David Barnes : sqlite3_prepare_v2()가 파일 내용의 루프 내부 또는 외부에 있습니까? 루프 외부에 bind()/step()이 있어야합니다. –

+1

준비가 루프 밖에있었습니다. –

3

상당히 오래된 글이므로 참고 용으로 만 업데이트하려고했습니다.

SQLite3 C/C++ API 가져 오기/내보내기 기능을 유지 관리하는 오픈 소스 API가 있습니다. 코드는 this link

관련 문제