SQLite 자습서(2): C/C++ 인터페이스 소개

1. 개요:
SQLite에서 제공하는 C/C++ 인터페이스 중 5개의 API가 핵심 인터페이스에 속합니다.이 블로그에서 우리는 그들의 사용법과 관련된 핵심 SQLite 대상, 예를 들어 데이터베이스_를 소개할 것이다connection and prepared_statement.다른 데이터베이스 엔진이 제공하는 API, 예를 들어 OCI, MySQL API 등에 비해 SQLite가 제공하는 인터페이스는 매우 이해하고 파악하기 쉽다.
   
2. 핵심 객체 및 인터페이스:
    1. 핵심 객체:
SQLite에서 가장 중요한 두 객체는 database_connection and prepared_statement.database_연결 대상은 sqlite3_open() 인터페이스 함수를 만들고 되돌려줍니다. 프로그램이 다른 SQLite 인터페이스 함수를 사용하기 전에 데이터베이스_connection 대상은 다음 다른 API 호출에서 해당 작업을 완성하기 위해 입력 매개 변수로 필요합니다.prepare_statement, 우리는 간단하게 그것을 컴파일된 SQL 문장으로 간주할 수 있으며, 따라서 모든 SQL 문장 실행과 관련된 함수도 지정한 SQL 작업을 완성하기 위해 이 대상을 입력 매개 변수로 해야 한다.
   
    2. 핵심 인터페이스:
    1). sqlite3_open
위에서 언급한 함수는 SQLite 데이터베이스를 조작하는 입구 함수입니다.이 함수가 반환하는 database_connection 객체는 다른 많은 SQLite API의 핸들 매개변수입니다.이 함수를 통해 이미 존재하는 데이터베이스 파일을 열 수도 있고 새로운 데이터베이스 파일을 만들 수도 있습니다.이 함수에 반환된 database_연결 대상, 우리는 데이터베이스와 관련된 임의의 조작을 완성하기 위해 여러 라인 사이에서 이 대상의 지침을 공유할 수 있습니다.그러나 다중 스레드 상황에서 우리가 더욱 추천하는 사용 방식은 모든 스레드에 독립된 데이터베이스를 만드는 것이다_연결 대상.이 함수에 대한 추가 설명도 필요합니다. SQLite가 자체적으로 가지고 있는 ATTACH 명령을 통해 한 연결에서 여러 데이터베이스에 편리하게 접근할 수 있기 때문에 여러 데이터베이스 연결 대상을 만들 필요가 없습니다.
       
    2). sqlite3_prepare
이 함수는 SQL 텍스트를 prepared_로 변환합니다.statement 대상, 함수 실행 후 이 대상의 지침을 되돌려줍니다.사실 이 함수는 매개 변수가 SQL 문장을 지정하는 것을 평가하지 않습니다. 이것은 단지 SQL 텍스트를 실행할 상태로 초기화하는 것입니다.마지막으로 지적해야 할 것은 새로운 응용 프로그램에 대해 우리는 sqlite3_를 사용할 수 있다prepare_v2 인터페이스 함수로 이 함수를 대체하여 같은 작업을 완성합니다.
   
    3). sqlite3_step
이 함수는 sqlite3_ 평가에 사용prepare 함수가 반환하는prepared_statement 대상, 이 함수를 실행한 후prepared_statement 대상의 내부 바늘은 되돌아오는 결과 집합의 첫 줄을 가리킵니다.만약 그 후의 데이터 줄을 더욱 교체하려고 한다면, 모든 데이터 줄이 다 지나갈 때까지 이 함수를 끊임없이 호출해야 한다.그러나 이 함수는 INSERT, UPDATE, DELETE 등 DML 문장에 대해 한 번에 수행됩니다.
   
    4). sqlite3_column
이 함수는 현재 행이 지정한 열의 데이터를 가져오는 데 사용되지만, 엄밀히 말하면 이 함수는 SQLite의 인터페이스 함수에 존재하지 않고 관련 인터페이스 함수 그룹으로 이 기능을 완성합니다. 그 중에서 각 함수는 다음과 같은 다양한 유형의 데이터를 반환합니다.
 

    sqlite3_column_blob
    sqlite3_column_bytes
    sqlite3_column_bytes16
    sqlite3_column_double
    sqlite3_column_int
    sqlite3_column_int64
    sqlite3_column_text
    sqlite3_column_text16
    sqlite3_column_type
    sqlite3_column_value
    sqlite3_column_count
 
그중 sqlite3_column_count 함수는 현재 결과가 집중된 필드 데이터를 가져오는 데 사용됩니다.다음은 sqlite3_를 사용합니다.step 및 sqlite3_column 함수 교체 결과는 각 줄의 데이터에 위조 코드를 집중시킵니다. 여기서 예시 코드로 필드 유형에 대한 판단을 간소화합니다.

     int fieldCount = sqlite3_column_count(...);
     while (sqlite3_step(...) <> EOF) {
         for (int i = 0; i < fieldCount; ++i) {
             int v = sqlite3_column_int(...,i);
         }
     }
    5). sqlite3_finalize
이 함수는preparedstatement 대상을 삭제하는 데 사용됩니다. 그렇지 않으면 메모리 유출이 발생합니다.
   
    6). sqlite3_close
이 함수는 이전에 열린 데이터베이스를 닫는 데 사용됩니다_connection 대상, 이 대상과 관련된prepared_statements 대상은 모두 그 전에 삭제되어야 합니다.
3. 매개 변수 귀속:
대부분의 관계형 데이터베이스와 마찬가지로 SQLite의 SQL 텍스트도 변수 연결을 지원하여 SQL 문장이 동적으로 해석되는 횟수를 줄이고 데이터 조회와 데이터 조작의 효율을 높인다.이 작업을 완료하려면 SQLite에서 제공하는 다른 두 개의 인터페이스 API, sqlite3_를 사용해야 합니다reset 및 sqlite3_bind.다음 예제를 참조하십시오.

void test_parameter_binding() {
        //1. 。
        char strSQL[128];
        for (int i = 0; i < MAX_ROWS; ++i) {
            sprintf(strSQL,"insert into testtable values(%d)",i);
            sqlite3_prepare_v2(..., strSQL);
            sqlite3_step(prepared_stmt);
            sqlite3_finalize(prepared_stmt);
        }
        //2. 。
        string strSQLWithParameter = "insert into testtable values(?)";
        sqlite3_prepare_v2(..., strSQL);
        for (int i = 0; i < MAX_ROWS; ++i) {
            sqlite3_bind(...,i);
            sqlite3_step(prepared_stmt);
            sqlite3_reset(prepared_stmt);
        }
        sqlite3_finalize(prepared_stmt);
    }
여기서 먼저 설명해야 할 것은 SQL 문장 "insert into testtable values(?)"의 물음표(?)매개 변수의 차지 문자를 나타내는데 이 규칙은 많은 관계형 데이터베이스에서 일치하기 때문에 데이터베이스 이식 작업에 비교적 편리하다.
위의 예제 코드를 통해 알 수 있듯이 매개 변수 귀속 쓰기의 실행 효율은 매번 다른 SQL 문장을 생성하는 쓰기보다 높다. 즉, 2) 효율상 1보다 현저히 우수하다. 다음은 이 두 가지 쓰기에 대한 구체적인 비교이다.
    1). 프로그램 표면만 보면 전자는 for 순환에서 더 많은 작업을 수행했다. 예를 들어 문자열 채우기, SQL 문장의prepare, 그리고prepared_statement 대상의 방출.
    2). SQLite의 공식 문서에 명시된 대로 sqlite3_prepare_v2의 실행 효율은 종종 sqlite3보다 낮다_step의 효율.
    3). 삽입된 데이터의 양이 비교적 크면 후자가 가져온 효율 향상은 상당히 볼 만하다.

좋은 웹페이지 즐겨찾기