티스토리 뷰

반응형

안녕하세요. 09LABS입니다.

저번 포스팅에서는 간단하게 SQLite3 API를 이용하여 C언어와 연동하는 방법에 대해 알아봤습니다.

이번 포스팅에서는 데이터베이스에 존재하는 테이블 유무를 알아내는 방법에 대해 알아보겠습니다.

데이터베이스는 간단하게 설명을 하면 크게 데이터베이스 - 테이블 - Column / Row 로 나눌 수 있습니다.

SQLite3, MariaDB, MongoDB등 데이터베이스는 여러가지가 있지만 본인이 사용하기 편한 것을 사용하면 되며,

저는 주로 임베디드 시스템에 사용하기 때문에 비교적 가벼운 SQLite3를 선택했습니다.

자 그럼 본론으로 들어가서 데이터 베이스에 존재하는 테이블을 확인하는 방법에 대해 알아보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <sqlite3.h>
 
void function_query(void *NotUsed, int argc, char **argv, char **azColName) {
  if(argv[0!= NULL)
        printf("callback = %d\n", atoi(argv[0]));
  return 0;
}
 
int main(void){
        int rc = 0;
        char query[500= {0}; // 쿼리 문자열 초기화
        int x = 0// Callback 리턴 변수
        char *zErrMsg;
        sqlite3 *db; // 데이터베이스 객체
        rc = sqlite3_open("test.db"&db); // 데이터베이스 Open
        if(!rc)
                printf("open successfully!\n");
        sprintf(query, "SELECT COUNT(*) FROM sqlite_master where name=\"table_name\";");
        sqlite3_exec(db, query, function_query, 0&zErrMsg);
        sqlite3_close(db);
        return 0;
}
cs

 

먼저 소스코드는 위와 같습니다.

저번 포스팅에서 크게 달라진 점은 '쿼리'가 추가되었고, '쿼리'를 실행하고 실행한 결과를 받을 함수 'function_query'가 추가되었습니다.

자 그럼 쿼리에 대해 알아볼까요?

SQL (Structured Query Language) 은 관계형 데이터베이스에서 사용하는 표준 질의 언어를 의미합니다.

사용방법은 다른 프로그래밍 언어(C, C++, Java 등...) 보다 단순하며 모든 DBMS에서 사용 가능합니다.

특히 대소문자를 구분하지 않는다는 점에서 매우 편리하면서도 조금 햇깔리실 수 있습니다.

여기서 쿼리는 데이터베이스에 질문을 해서 정보를 얻는 것을 의미하며, 이러한 질문을 쿼리문 (SELECT, CREATE, INSERT 등)을

사용하여 실행할 수 있습니다.

1
2
        sprintf(query, "SELECT COUNT(*) FROM sqlite_master where name=\"table_name\";");
        sqlite3_exec(db, query, function_query, 0&zErrMsg);
cs


위의 문장을 살펴보면 실행할 쿼리문을 query 문자열에 복사하여 sqlite3_exec 함수로 실행합니다.

쿼리문을 실행한 결과는 function_query 함수로 전달되게 됩니다.

1
2
3
4
5
void function_query(void *NotUsed, int argc, char **argv, char **azColName) {
  if(argv[0!= NULL)
        printf("callback = %d\n", atoi(argv[0]));
  return 0;
}
cs


자 function_query 함수를 보면 뭔가 굉장히 많은 변수들이 있습니다. 이 변수들에 대해서는 나중에 언급할 예정입니다.

우선 살펴보아야 할 부분은 argv 인데요, argv는 실행한 결과를 받아오는 변수라고 볼 수 있습니다.

만약에 실행한 결과가 아무 결과를 나타내지 않는다면 NULL을 반환하게 됩니다. 만약에 NULL을 

atoi로 변환하여 integer로 리턴을 받으려고 한다면 Segmentation Fault가 발생하게 될 것입니다.

따라서 저는 미리 if(argv[0] != NULL) 문장을 추가하여 NULL이 아닐 경우에만 변환을 하여 출력하도록 하였습니다.

그럼 실행결과를 확인해보도록 하겠습니다.


우선 SQLite3 데이터베이스에 table_name이라는 테이블을 하나 생성하여 확인할 수 있습니다.

test.db가 정상적으로 open되었고, function_query문이 실행되어 table_name이 한 개 있다는 것을 확인할 수 있습니다.

 

반응형

'코딩하자 > C언어' 카테고리의 다른 글

[SQLite3] 01. C API 연동하기 및 기초 코드  (0) 2019.08.01
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함