English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLite C / C ++

Neste capítulo, você aprenderá como usar SQLite no C / C ++usamos SQLite.

instalação

Em nosso programa C / C ++Antes de começar a usar a interface SQLite no seu programa, você precisa garantir que a biblioteca SQLite esteja configurada no seu computador. Você pode consultar o capítulo 'Instalação do SQLite' para saber o processo de instalação.

C / C ++API

A seguir estão os pontos importantes da interface API / C ++ Exemplo de interface SQLite, que é suficiente para você começar a usar SQLite a partir do C / C ++Requisitos do banco de dados SQLite usado pelo programa. Se você estiver procurando por aplicações mais complexas, pode consultar a documentação oficial do SQLite.

NúmeroAPI e descrição
1

sqlite3_open(const char *filename, sqlite3 **ppDb)

Esta rotina abre uma conexão com o arquivo do banco de dados SQLite e retorna um objeto de conexão de banco de dados, para uso em outras rotinas SQLite.

sefilenamese o parâmetro for NULL ou 'memory:', sqlite3_open()criará um banco de dados em RAM, que existirá apenas durante a sessão.

se o nome do arquivo não for NULL, sqlite3_open()tenta abrir o arquivo de banco de dados usando seu valor. Se o arquivo com o nome especificado não existir, sqlite3_open()abre um novo arquivo de banco de dados com o nome especificado.

2

sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)

Esta rotina oferece uma maneira rápida e conveniente de executar os comandos SQL fornecidos pelo parâmetro sql, que pode consistir em múltiplos comandos SQL.

aqui, o primeiro parâmetrosqlite3é um objeto de banco de dados aberto,sqlite_callbacké um callback cujodadosé o primeiro parâmetro e retornará errmsg para capturar qualquer erro gerado pela rotina.

sqlite3_exec()rotina analisa e executasqlcada comando fornecido no parâmetro, até atingir o final da string ou encontrar um erro.

3

sqlite3_close(sqlite3*)

Este exemplo fecha anteriormente chamadas através de sqlite3打开的数据库连接_open()。与连接关联的所有准备好的语句应在关闭连接之前完成。

如果还有任何尚未完成的查询,则sqlite3_close()将返回SQLITE_BUSY,错误消息由于未完成的语句而无法关闭。

连接到数据库

以下C代码段显示了如何连接到现有数据库。如果数据库不存在,则将创建该数据库,最后将返回一个数据库对象。

#include <stdio.h>
#include <sqlite3.h> 
int main(int argc, char* argv[]) {
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   rc = sqlite3_open("test.db", &db); if( rc ) {
      fprintf(stderr, "Não foi possível abrir o banco de dados: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "成功打开数据库\n");
   }
   sqlite3_close(db);
}

现在,让我们编译并运行上述程序,以test.db在当前目录中创建数据库。您可以根据需要更改路径。

$gcc test.c -l sqlite3
$./a.out
成功打开数据库

如果要使用C ++源代码,则可以按以下方式编译代码-

$g++ test.c -l sqlite3

在这里,我们将程序与sqlite3库链接在一起,以提供C程序所需的功能。这将在您的目录中创建一个数据库文件test.db,您将得到以下结果。

-rwxr-xr-x. 1 root root 7383 May 8 02:06 a.out
-rw-r--r--. 1 root root  323 May 8 02:05 test.c
-rw-r--r--. 1 root root    0 May 8 02:06 test.db

创建表

以下C代码段将用于在先前创建的数据库中创建表-

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   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;
   /*Abrir banco de dados*/
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Não foi possível abrir o banco de dados: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stdout, "已成功打开数据库\n");
   }
   /* Criar instrução SQL */
   sql = "CREATE TABLE COMPANY(" \
      "ID INT PRIMARY KEY     NOT NULL," \
      "NAME           TEXT    NOT NULL," \
      "AGE            INT     NOT NULL," \
      "ADDRESS        CHAR("50)," \
      "SALARY         REAL ");;
   /* 执行 SQL 语句 */
   rc = sqlite3000.00 );";
   
   _exec(db, sql, callback, 0, &zErrMsg);
      fprintf(stderr, "Erro SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "表创建成功\n");
   }
   sqlite3_close(db);
   return 0;
}

编译并执行上述程序后,它将在test.db中创建COMPANY表,文件的最终列表如下-

-rwxr-xr-x. 1 root root 9567 May 8 02:31 a.out
-rw-r--r--. 1 root root 1207 May 8 02:31 test.c
-rw-r--r--. 1 root root 3072 May 8 02:31 test.db

Insert 操作

以下C代码段显示了如何在上述示例中创建的COMPANY表中创建记录-

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
   int i;
   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;
   /* Abrir banco de dados */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Não foi possível abrir o banco de dados: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Banco de dados aberto com sucesso\n");
   }
   /* Criar instrução SQL */
   sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \1, 'Paul', 32, 'Paul', 2, 'California',
         0000.00 )" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \2"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ 25, 'Allen', 15, 'Texas',
         0000.00 )" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \3000.00 )" ;\ 23, 'Teddy', 2, 'Norway',
         0000.00 )" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \4"VALUES ( 25, 'Mark',-, 'Rich 65Mond ',
   /* Executar comando SQL */
   rc = sqlite3000.00 );";
   
   _exec(db, sql, callback, 0, &zErrMsg);
      fprintf(stderr, "Erro SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      if( rc != SQLITE_OK ) {
   }
   sqlite3_close(db);
   return 0;
}

fprintf(stdout, "Registro criado com sucesso\n");-

Banco de Dados aberto com sucesso
Após compilar e executar o programa acima, ele criará o registro dado na tabela COMPANY e exibirá as seguintes duas linhas

Registro criado com sucesso

Operação de seleção-

Antes de continuar com o exemplo real para obter registros, vamos ver alguns detalhes sobre as funções de callback usadas no exemplo. A callback fornece um método para obter resultados de uma instrução SELECT. Ela tem a seguinte declaração*sqlite3typedef int (
   _callback)_TypeInfo*,    /* void3do _exec() na sqlite4Os dados fornecidos nos parâmetros */
   int,      /* Número de colunas na linha */
   char**,   /* Array de strings que representa os campos da linha */
   char**    /* Array de strings que representa os nomes das colunas */
);

Se o callback acima for fornecido como o terceiro parâmetro na rotina sqlite_exec(), o SQLite chamará essa função de callback para cada registro de cada SELECT executado dentro dos parâmetros SQL.

O seguinte trecho de código C mostra como obter e exibir registros da tabela COMPANY criada no exemplo anterior.-

#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";
   /* Abrir banco de dados */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Não foi possível abrir o banco de dados: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Banco de dados aberto com sucesso\n");
   }
   /* Criar instrução SQL */
   sql = "SELECT * from COMPANY";
   /* Executar comando SQL */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "Erro SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operação concluída com sucesso\n");
   }
   sqlite3_close(db);
   return 0;
}

Após compilar e executar o programa acima, será gerado o seguinte resultado.

Banco de Dados aberto com sucesso
Função de Retorno Chamada: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0
Função de Retorno Chamada: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
Função de Retorno Chamada: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
Função de Retorno Chamada: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
Operação concluída com sucesso

Operação de atualização

O seguinte trecho de código C mostra como usar a instrução UPDATE para atualizar qualquer registro e, em seguida, obter e exibir o registro atualizado da tabela COMPANY.

#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";
   /* Abrir banco de dados */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Não foi possível abrir o banco de dados: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Banco de dados aberto com sucesso\n");
   }
   /*Criar comando SQL combinado*/
   sql = "UPDATE COMPANY set SALARY = 25000.00 onde ID=1; \

         "SELECT * from COMPANY";
   /* Executar comando SQL */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "Erro SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operação concluída com sucesso\n");
   }
   sqlite3_close(db);
   return 0;
}

Após compilar e executar o programa acima, será gerado o seguinte resultado.

Banco de Dados aberto com sucesso
Função de Retorno Chamada: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 25000.0
Função de Retorno Chamada: ID = 2
NAME = Allen
AGE = 25
ADDRESS = Texas
SALARY = 15000.0
Função de Retorno Chamada: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
Função de Retorno Chamada: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
Operação concluída com sucesso

Operação de exclusão

O seguinte código C demonstra como usar a cláusula DELETE para excluir qualquer registro e, em seguida, obter e exibir os registros restantes da tabela COMPANY.

#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";
   /* Abrir banco de dados */
   rc = sqlite3_open("test.db", &db);   
   if( rc ) {
      fprintf(stderr, "Não foi possível abrir o banco de dados: %s\n", sqlite3_errmsg(db));
      return(0);
   } else {
      fprintf(stderr, "Banco de dados aberto com sucesso\n");
   }
   /* Criar comando SQL combinado */
   sql = "DELETE from COMPANY where ID=",2; \

         "SELECT * from COMPANY";
   /* Executar comando SQL */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   
   if( rc != SQLITE_OK ) {
      fprintf(stderr, "Erro SQL: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   } else {
      fprintf(stdout, "Operação concluída com sucesso\n");
   }
   sqlite3_close(db);
   return 0;
}

Após compilar e executar o programa acima, será gerado o seguinte resultado.

Banco de Dados aberto com sucesso
Função de Retorno Chamada: ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0
Função de Retorno Chamada: ID = 3
NAME = Teddy
AGE = 23
ADDRESS = Norway
SALARY = 20000.0
Função de Retorno Chamada: ID = 4
NAME = Mark
AGE = 25
ADDRESS = Rich-Mond
SALARY = 65000.0
Operação concluída com sucesso