1. Интерфейс SQLite


1.1 открытый

SQLITE_API int sqlite3_open(  const char *filename,   /* Database filename (UTF-8) */  sqlite3 **ppDb          /* OUT: SQLite db handle */);


1.2 исполнитель

SQLITE_API int sqlite3_exec(  sqlite3*,                                  /* An open database */  const char *sql,                           /* SQL to be evaluated */  int (*callback)(void*,int,char**,char**),  /* Callback function */  void *,                                    /* 1st argument to callback */  char **errmsg                              /* Error msg written here */);

1.3 закрыть

SQLITE_API int sqlite3_close(sqlite3*);


2. Функция обратного вызова в exec

В этой статье в основном рассказывается об интерфейсе exec и обратном вызове в SQLite.Давайте сначала посмотрим на параметры в exec:

  • sqlite3* Дескриптор, возвращаемый базой данных, открытой функцией open;

  • const char *sql — оператор SQL;

  • int(*callback)(void*,int,char**,char**) функция обратного вызова, обычно используемая для получения данных, запрашиваемых оператором SQL;

  • void *, этот параметр используется как первый параметр в callback-функции;

  • char **errmsg Если во время выполнения возникает ошибка, она будет записана здесь.

int callback(void* data, int argc, char** argv, char** azColName)

Например, теперь у меня есть база данных, как показано ниже:

картина

Прежде всего, обратный вызов не просто вызывает функцию обратного вызова после выполнения exec, а определяется в соответствии с результатом запроса. Если результат, удовлетворяющий оператору SQL, содержит 100 строк, функция обратного вызова будет вызываться 100 раз, и каждая функция обратного вызова используется для получения строки записей, что также можно увидеть в следующих тестовых процедурах.

Как показано в таблице выше, я хочу запросить запись с идентификатором 1. Первый параметр функции обратного вызова — это параметр, переданный пользователем, то есть четвертый параметр функции exec, а второй параметр — сколько полей в результате запроса.(столбец), в приведенной выше таблице число 4, третий параметр это значение поля, а именно (1, Robin, 96.0, 28), а четвертый параметр это поле name, а именно (ID, Name, Grade, Age), через эти три параметра можно получить только одну строку данных. Затем полученные данные выдаются через первый параметр.

3. Стандартный код

Следующий код предназначен для запроса всех записей в приведенной выше диаграмме и вывода данных.

#include <stdio.h>#include <stdlib.h>#include "sqlite3.h"
static int callback(void* data, int argc, char** argv, char** azColName) { int i; fprintf(stderr, "%s: ", (const char*)data); for (i = 0; i < argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0;}
int main(int argc, char* argv[]) { sqlite3* db; char* zErrMsg = 0; int rc; char* sql; const char* data = "Callback function called";
/* Open database */ rc = sqlite3_open("typedef.db", &db); if (rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); exit(0); } else { fprintf(stderr, "Opened database successfully\n"); }
/* Create SQL statement */ sql = "SELECT * from typedef";
/* Execute SQL statement */ rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if (rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Operation done successfully\n"); } sqlite3_close(db); return 0;}

Результат выполнения следующий:

картина

Источник: typedef
Добрые советы:

Из-за недавних изменений в правилах рассылки на публичной платформе WeChat многие читатели сообщали, что вовремя не увидели обновленные статьи. Согласно последним правилам, рекомендуется нажимать «рекомендуется к прочтению, поделиться, собрать» и т. д., чтобы стать постоянными читателями.

Рекомендуемое чтение:

Нажмите [Просмотр], чтобы добавить куриные ножки в редактор.

картина