English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste capítulo, você aprenderá como usar SQLite no C / C ++usamos SQLite.
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.
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úmero | API 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
以下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
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
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
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