C++ 프로젝트에서 SQLite 데이터베이스를 연동할 때, 환경 설정이 끝난 후에도 "No such table"이나 "Database not found"와 같은 오류로 인해 난관에 부딪히는 경우가 많습니다. 이는 주로 데이터베이스 파일의 경로 설정이나 런타임 시의 작업 디렉토리 불일치로 인해 발생합니다. C++ 인터페이스를 사용하여 SQLite를 안정적으로 연결하고 데이터를 조회하는 방법을 정리합니다.
1. CLI를 이용한 데이터베이스 및 테이블 준비
코드에서 데이터베이스를 제어하기 전에, 먼저 SQLite CLI(Command Line Interface)를 통해 데이터베이스 파일과 테이블을 생성하는 것이 정확한 연동 여부를 확인하는 데 도움이 됩니다. 특정 폴더(예: D:\storage)를 생성한 후 아래 명령어를 수행합니다.
-- 데이터베이스 접속 및 파일 생성
sqlite3 my_test.db
-- 테이블 정의
CREATE TABLE members (
uid INTEGER PRIMARY KEY AUTOINCREMENT,
user_name TEXT NOT NULL,
age INTEGER,
location TEXT,
balance REAL
);
-- 초기 데이터 삽입
INSERT INTO members (user_name, age, location, balance) VALUES ('Alice', 30, 'Seoul', 5000.50);
INSERT INTO members (user_name, age, location, balance) VALUES ('Bob', 25, 'Busan', 3200.00);
INSERT INTO members (user_name, age, location, balance) VALUES ('Charlie', 28, 'Incheon', 1500.75);
2. C++ 소스 코드 구현
C++에서 SQLite API를 호출할 때는 데이터베이스 핸들을 열고, SQL 문을 실행한 뒤 콜백 함수를 통해 결과를 처리하는 과정을 거칩니다. 이때 데이터베이스 파일 경로는 실행 파일 기준의 상대 경로보다 절대 경로를 사용하는 것이 초기 디버깅 단계에서 유리합니다.
#include <iostream>
#include <string>
#include "sqlite3.h"
using namespace std;
// 데이터 조회를 위한 콜백 함수
static int onRowReceived(void* data, int colCount, char** rowValues, char** colNames) {
for (int i = 0; i < colCount; i++) {
cout << colNames[i] << ": " << (rowValues[i] ? rowValues[i] : "NULL") << " | ";
}
cout << endl;
return 0;
}
int main() {
sqlite3* dbHandle = nullptr;
char* errorMsg = nullptr;
// 데이터베이스 연결 (절대 경로 권장)
const char* dbPath = "D:\\storage\\my_test.db";
int connectionResult = sqlite3_open(dbPath, &dbHandle);
if (connectionResult != SQLITE_OK) {
cerr << "데이터베이스 연결 실패: " << sqlite3_errmsg(dbHandle) << endl;
return connectionResult;
}
cout << "데이터베이스 연결 성공" << endl;
// 데이터 조회 쿼리 실행
string query = "SELECT * FROM members;";
int execResult = sqlite3_exec(dbHandle, query.c_str(), onRowReceived, nullptr, &errorMsg);
if (execResult != SQLITE_OK) {
cerr << "SQL 실행 오류: " << errorMsg << endl;
sqlite3_free(errorMsg);
}
// 자원 해제
sqlite3_close(dbHandle);
return 0;
}
3. "No such table" 오류가 발생하는 원인
코드 실행 시 sqlite3_open 함수가 성공하더라도, 뒤이어 실행한 SELECT 문에서 테이블을 찾을 수 없다는 오류가 발생할 수 있습니다. 이는 SQLite의 특성 때문입니다.
- 자동 파일 생성: 지정한 경로에 데이터베이스 파일이 없더라도
sqlite3_open은 빈 파일을 자동으로 생성하며SQLITE_OK를 반환합니다. - 경로 오해: 만약 코드에
test.db라고만 기재했다면, 개발 환경(IDE)의 프로젝트 폴더와 실제 빌드된.exe파일의 실행 경로가 달라 엉뚱한 위치의 빈 데이터베이스 파일을 읽게 됩니다. - 해결 방안: CLI에서 생성한 파일의 위치를 절대 경로로 정확히 지정하거나, 프로그램 실행 전
.table명령어로 CLI 내에서 테이블 존재 여부를 다시 확인해야 합니다.
CLI에서 확인 시 아래 명령어를 사용하여 데이터베이스 상태를 점검하십시오.
.open D:/storage/my_test.db
.tables
.database
이와 같은 절차를 통해 경로 문제를 배제하면 C++ 환경에서도 SQLite를 원활하게 통합하여 활용할 수 있습니다.