SQLite Database Operations in C: Opening, Querying, and Closing

Required Header File

sqlite3.h

Compilation Command

gcc program.c -lsqlite3

Programming Workflow

  1. Open database connection
  2. Perform operations (insert, update, delete, select)
  3. Close database connection

Opening a Database Connection

int sqlite3_open(const char *filename, sqlite3 **ppDb);
  • Purpose: Establishes connection to SQLite data base file
  • Parameters:
    • filename: Path to database file
    • ppDb: Pointer to database handle
  • Returns: SQLITE_OK (0) on success, error code on failure

Closing a Database Connection

int sqlite3_close(sqlite3 *db);
  • Purpose: Releases database resources
  • Parameter: Database handle to close
  • Returns: SQLITE_OK (0) on success

Querying Data

int sqlite3_exec(
  sqlite3 *db,
  const char *sql,
  int (*callback)(void*,int,char**,char**),
  void *arg,
  char **errmsg
);

Example implementation:

#include <stdio.h>
#include <sqlite3.h>

int auth_callback(void* param, int col_count, char** values, char** columns) {
    int* auth_flag = (int*)param;
    *auth_flag = 1;
    return 0;
}

int main() {
    sqlite3 *db_conn;
    int status = sqlite3_open("users.db", &db_conn);
    
    if (status != SQLITE_OK) {
        fprintf(stderr, "Connection error: %s\n", sqlite3_errmsg(db_conn));
        sqlite3_close(db_conn);
        return 1;
    }

    char query[256];
    snprintf(query, sizeof(query), 
             "SELECT * FROM accounts WHERE username='%s' AND password='%s';",
             "admin", "secret123");
    
    char *error_msg = NULL;
    int auth_result = 0;
    
    status = sqlite3_exec(db_conn, query, auth_callback, &auth_result, &error_msg);
    
    if (status != SQLITE_OK) {
        fprintf(stderr, "Query error: %s\n", error_msg);
        sqlite3_free(error_msg);
    } else if (auth_result) {
        printf("Authentication successful\n");
    } else {
        printf("Invalid credentials\n");
    }
    
    sqlite3_close(db_conn);
    return 0;
}

Executing Non-Query Statements

#include <stdio.h>
#include <sqlite3.h>

int main() {
    sqlite3 *db_handle;
    int rc = sqlite3_open("inventory.db", &db_handle);
    
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Database error: %s\n", sqlite3_errmsg(db_handle));
        sqlite3_close(db_handle);
        return 1;
    }
    
    const char *insert_stmt = "INSERT INTO products VALUES(101, 'Laptop', 999.99);";
    char *err_msg = NULL;
    
    rc = sqlite3_exec(db_handle, insert_stmt, NULL, NULL, &err_msg);
    
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", err_msg);
        sqlite3_free(err_msg);
    } else {
        printf("Record inserted successfully\n");
    }
    
    sqlite3_close(db_handle);
    return 0;
}

Callback Function Signature

int callback(void *user_data, int column_count, char **column_values, char **column_names);
  • user_data: Custom data passed from sqlite3_exec
  • column_count: Number of columns in result
  • column_values: Array of field values
  • column_names: Array of field names
  • Returns: 0 to continue processing, non-zero to abort

Tags: sqlite c-programming database embedded-databases

Posted on Wed, 04 Nov 2026 16:19:49 +0000 by chetanmadaan