Latest web development tutorials

SQLiteの - C / C ++

インストール

SQLiteのを使用する前に、C / C ++プログラムでは、我々はマシン上のSQLiteライブラリがあることを確認する必要があります。 インストール・プロセスのためのSQLiteのインストールセクションを表示することができます。

C / C ++インタフェースAPI

C / C ++プログラムでのSQLiteデータベースを使用して、あなたのニーズを満たすために重要なC&C ++ / SQLiteのインタフェースプログラムは以下のとおりです。 あなたはより多くの詳細が必要な場合は、公式SQLiteのドキュメントを参照してください。

序号API & 描述
1sqlite3_open(const char *filename, sqlite3 **ppDb)

该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。

如果filename参数是 NULL 或 ':memory:',那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。

如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。

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

该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。

在这里,第一个参数sqlite3是打开的数据库对象,sqlite_callback是一个回调,data作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。

sqlite3_exec() 程序解析并执行由sql参数所给的每个命令,直到字符串结束或者遇到错误为止。

3sqlite3_close(sqlite3*)

该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。

如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。

データベースへの接続

次のCコードスニペットは、既存のデータベースに接続する方法を示しています。 データベースが存在しない場合、それが作成され、最終的に、データベース・オブジェクトを返します。

書式#include <stdio.hに>
書式#include <sqlite3.h>

int型のmain(int型のARGC、char型*のARGV [])
{
   sqlite3のの*のデシベル。
   char型* zErrMsg = 0;
   int型のrc;

   RC = sqlite3_open( "test.dbという"、&デシベル);

   {(RC)の場合
      関数fprintf(stderrに、 "開けませんデータベース:%sのを\ n"、sqlite3_errmsg(デシベル));
      出口(0);
   }エルス{
      関数fprintf(stderrに、「開かれたデータベースが正常に\ n ");
   }
   sqlite3_close(DB)。
}

それでは、現在のディレクトリにある当社のデータベースtest.dbというを作成し、上記のプログラムをコンパイルして実行してみましょう。 必要に応じてパスを変更することができます。

$のgcc test.cの-l sqlite3の
$。/ a.outの
データベース正常にオープン

あなたがC ++ソースコードを使用したい場合は、次のコードに合わせて示してコンパイルすることができます。

$ G ++ test.cの-l sqlite3の

ここでは、Cプログラムのための私達のプログラムのリンクsqlite3のライブラリが必要な機能を提供します。 これは、次のような結果を得るでしょう、あなたのディレクトリにデータベースファイルtest.dbというを作成します。

-rwxr-XR-xの1ルートルート7383 5月8日2時06分のa.out
-rw-rを -  r--の1ルートルート323 5月8日午前2時05分test.c.
-rw-rを -  r--の1ルートルート0 5月8日午前2時06分test.db.

テーブルを作成します。

次のCコードスニペットは、以前に作成したデータベースにテーブルを作成するために使用されます。

書式#include <stdio.hに>
書式#include <stdlib.h>に含ま
書式#include <sqlite3.h> 

静的なint型のコールバック(void *型NOTUSED、int型のargc、char型** argvの、char型** azColName){
   私はint型。
   以下のための(ⅰ= 0; I&LT;のargc; iは++){
      printf( "%sの=%sの\ n"は、azColName [i]は、ARGV [i]はARGV [i]は:? "NULL");
   }
   printf( "\ n")を。
   0を返します。
}

int型のmain(int型のARGC、char型*のARGV [])
{
   sqlite3のの*のデシベル。
   char型* zErrMsg = 0;
   int型のrc;
   char *のSQL。

   / *データベースをオープン* /
   RC = sqlite3_open( "test.dbという"、&デシベル);
   {(RC)の場合
      関数fprintf(stderrに、 "開けませんデータベース:%sのを\ n"、sqlite3_errmsg(デシベル));
      出口(0);
   }エルス{
      関数fprintf(stdoutに、「開かれたデータベースが正常に\ n ");
   }

   / * SQL文を作成します* /
   SQL = \ "(表会社を作成」
         「ID INT PRIMARY KEY、NOT NULL、 "\
         「名前テキスト、NOT NULL、 "\
         "NOT NULLとAGEのINT、" \
         「アドレスCHAR(50)、 "\
         「SALARYのREAL); ";

   / * * SQL文を実行/
   RC = sqlite3_exec(デシベル、SQL、コールバック、0、&zErrMsg);
   場合(RC!= SQLITE_OK){
   関数fprintf(stderrに、「SQLエラー:%sの\ nを "、zErrMsg)。
      sqlite3_free(zErrMsg)。
   }エルス{
      関数fprintf(stdoutに、「N \正常に作成表 ");
   }
   sqlite3_close(DB)。
   0を返します。
}

上記のプログラムをコンパイルして実行すると、次のように、test.dbというファイル内のファイルの最終リストをCOMPANYテーブルを作成します。

-rwxr-XR-xの1ルートルート9567 5月8日午前2時31 a.outの
-rw-rを -  r--の1ルートルート1207年5月8日午前2時31 test.c.
-rw-rを -  r--の1ルートルート3072 5月8日午前2時31 test.db.

INSERT操作

次のCコードスニペットは、上記で作成した会社テーブル内のレコードを作成する方法を示しています。

書式#include <stdio.hに>
書式#include <stdlib.h>に含ま
書式#include <sqlite3.h>

静的なint型のコールバック(void *型NOTUSED、int型のargc、char型** argvの、char型** azColName){
   私はint型。
   以下のための(ⅰ= 0; I&LT;のargc; iは++){
      printf( "%sの=%sの\ n"は、azColName [i]は、ARGV [i]はARGV [i]は:? "NULL");
   }
   printf( "\ n")を。
   0を返します。
}

int型のmain(int型のARGC、char型*のARGV [])
{
   sqlite3のの*のデシベル。
   char型* zErrMsg = 0;
   int型のrc;
   char *のSQL。

   / *データベースをオープン* /
   RC = sqlite3_open( "test.dbという"、&デシベル);
   {(RC)の場合
      関数fprintf(stderrに、 "開けませんデータベース:%sのを\ n"、sqlite3_errmsg(デシベル));
      出口(0);
   }エルス{
      関数fprintf(stderrに、「開かれたデータベースが正常に\ n ");
   }

   / * SQL文を作成します* /
   SQL = "COMPANYのINSERT INTO(ID、名前、年齢、住所、給与)」\
         「VALUES(1、 'ポール'、32、 'カリフォルニア'、20000.00); "\
         「COMPANY INTO(ID、名前、年齢、住所、SALARY)を挿入」\
         「VALUES(2、 'アレン'、25、 'テキサス'、15000.00); "\
         「COMPANY INTO(ID、名前、年齢、住所、SALARY)を挿入」\
         「VALUES(3、 'テディ'、23、 'ノルウェー'、20000.00); "\
         「COMPANY INTO(ID、名前、年齢、住所、SALARY)を挿入」\
         "VALUES(4、 'マーク'、25、 'リッチモンド」、65000.00);";

   / * * SQL文を実行/
   RC = sqlite3_exec(デシベル、SQL、コールバック、0、&zErrMsg);
   場合(RC!= SQLITE_OK){
      関数fprintf(stderrに、「SQLエラー:%sの\ nを "、zErrMsg)。
      sqlite3_free(zErrMsg)。
   }エルス{
      関数fprintf(stdoutに、「\ nを正常に作成レコード ");
   }
   sqlite3_close(DB)。
   0を返します。
}

上記のプログラムをコンパイルして実行されると、それは与えられたレコードの会社テーブルに作成して、次の2行が表示されます:

データベース正常にオープン
正常に作成されたレコード

SELECT操作

私たちが記録された例を説明する始める前に、私たちが最初に私たちの例では、使用することになり、コールバック関数の詳細のいくつかを理解しましょう。 このコールバックは、SELECT文法から得られた結果を提供します。 これは次のように宣言されます。

typedef int型(* sqlite3_callback)(
sqlite3_execの第四引数(で提供空隙*、/ *データ)* /
int型、/ *行の列数* /
char型**、/ *行のフィールドを表す文字列の配列* /
char型** / *列名を表す文字列の配列* /
);

sqlite_exec()プロシージャ内の第三のパラメータとして上記のコールバックは、各SELECTステートメントの実行プロセスのパラメータ内の各レコードのSQLiteのSQLは、コールバック関数を呼び出す場合。

次のCコードスニペットは、以前に作成したCOMPANYテーブルから取得する方法を示していますし、レコードを表示します。

書式#include <stdio.hに>
書式#include <stdlib.h>に含ま
書式#include <sqlite3.h>

静的なint型のコールバック(void *型のデータ、int型のargc、char型** argvの、char型** azColName){
   私はint型。
   関数fprintf(stderrに、 "%sの:"、(constのchar型*)データ);
   以下のための(ⅰ= 0; I&LT;のargc; iは++){
      printf( "%sの=%sの\ n"は、azColName [i]は、ARGV [i]はARGV [i]は:? "NULL");
   }
   printf( "\ n")を。
   0を返します。
}

int型のmain(int型のARGC、char型*のARGV [])
{
   sqlite3のの*のデシベル。
   char型* zErrMsg = 0;
   int型のrc;
   char *のSQL。
   constのchar *データ= "と呼ばれるコールバック関数」。

   / *データベースをオープン* /
   RC = sqlite3_open( "test.dbという"、&デシベル);
   {(RC)の場合
      関数fprintf(stderrに、 "開けませんデータベース:%sのを\ n"、sqlite3_errmsg(デシベル));
      出口(0);
   }エルス{
      関数fprintf(stderrに、「開かれたデータベースが正常に\ n ");
   }

   / * SQL文を作成します* /
   SQL = "COMPANYからのSELECT *";

   / * * SQL文を実行/
   RC = sqlite3_exec(デシベル、SQL、コールバック、(void *型)データ、&zErrMsg);
   場合(RC!= SQLITE_OK){
      関数fprintf(stderrに、「SQLエラー:%sの\ nを "、zErrMsg)。
      sqlite3_free(zErrMsg)。
   }エルス{
      関数fprintf(stdoutに、「N \成功した操作 ");
   }
   sqlite3_close(DB)。
   0を返します。
}

上記のプログラムをコンパイルして実行されると、次の結果を生成します。

データベース正常にオープン
ID = 1:と呼ばれるコールバック関数
NAME =ポール
AGE = 32
ADDRESS =カリフォルニア州
SALARY = 20000.0

ID = 2:と呼ばれるコールバック関数
NAME =アレン
AGE = 25
ADDRESS =テキサス州
SALARY = 15000.0

ID = 3:と呼ばれるコールバック関数
NAME =テディ
AGE = 23
ADDRESS =ノルウェー
SALARY = 20000.0

ID = 4:と呼ばれるコールバック関数
NAME =マーク
AGE = 25
ADDRESS =リッチモンド
SALARY = 65000.0

操作が正常に行われ

UPDATE操作

次のCコードスニペットは、その後、任意のレコードを更新COMPANYテーブルから取得し、更新されたレコードを表示するには、UPDATEステートメントを使用する方法を示しています。

書式#include <stdio.hに>
書式#include <stdlib.h>に含ま
書式#include <sqlite3.h> 

静的なint型のコールバック(void *型のデータ、int型のargc、char型** argvの、char型** azColName){
   私はint型。
   関数fprintf(stderrに、 "%sの:"、(constのchar型*)データ);
   以下のための(ⅰ= 0; I&LT;のargc; iは++){
      printf( "%sの=%sの\ n"は、azColName [i]は、ARGV [i]はARGV [i]は:? "NULL");
   }
   printf( "\ n")を。
   0を返します。
}

int型のmain(int型のARGC、char型*のARGV [])
{
   sqlite3のの*のデシベル。
   char型* zErrMsg = 0;
   int型のrc;
   char *のSQL。
   constのchar *データ= "と呼ばれるコールバック関数」。

   / *データベースをオープン* /
   RC = sqlite3_open( "test.dbという"、&デシベル);
   {(RC)の場合
      関数fprintf(stderrに、 "開けませんデータベース:%sのを\ n"、sqlite3_errmsg(デシベル));
      出口(0);
   }エルス{
      関数fprintf(stderrに、「開かれたデータベースが正常に\ n ");
   }

   / *マージされたSQL文を作成します* /
   SQL = "UPDATE会社がSALARY = 25000.00を設定する場所ID = 1;" \
         「COMPANYからのSELECT * ";

   / * * SQL文を実行/
   RC = sqlite3_exec(デシベル、SQL、コールバック、(void *型)データ、&zErrMsg);
   場合(RC!= SQLITE_OK){
      関数fprintf(stderrに、「SQLエラー:%sの\ nを "、zErrMsg)。
      sqlite3_free(zErrMsg)。
   }エルス{
      関数fprintf(stdoutに、「N \成功した操作 ");
   }
   sqlite3_close(DB)。
   0を返します。
}

上記のプログラムをコンパイルして実行されると、次の結果を生成します。

データベース正常にオープン
ID = 1:と呼ばれるコールバック関数
NAME =ポール
AGE = 32
ADDRESS =カリフォルニア州
SALARY = 25000.0

ID = 2:と呼ばれるコールバック関数
NAME =アレン
AGE = 25
ADDRESS =テキサス州
SALARY = 15000.0

ID = 3:と呼ばれるコールバック関数
NAME =テディ
AGE = 23
ADDRESS =ノルウェー
SALARY = 20000.0

ID = 4:と呼ばれるコールバック関数
NAME =マーク
AGE = 25
ADDRESS =リッチモンド
SALARY = 65000.0

操作が正常に行われ

DELETE操作

次のCコードスニペットは、DELETEステートメントを使用する方法を示しレコードをすべて削除し、その後COMPANYテーブルから取り出され、残りの記録が表示されます。

書式#include <stdio.hに>
書式#include <stdlib.h>に含ま
書式#include <sqlite3.h> 

静的なint型のコールバック(void *型のデータ、int型のargc、char型** argvの、char型** azColName){
   私はint型。
   関数fprintf(stderrに、 "%sの:"、(constのchar型*)データ);
   以下のための(ⅰ= 0; iは<のargc; iは++){
      printf( "%sの=%sの\ n"は、azColName [i]は、ARGV [i]はARGV [i]は:? "NULL");
   }
   printf( "\ n")を。
   0を返します。
}

int型のmain(int型のARGC、char型*のARGV [])
{
   sqlite3のの*のデシベル。
   char型* zErrMsg = 0;
   int型のrc;
   char *のSQL。
   constのchar *データ= "と呼ばれるコールバック関数」。

   / *データベースをオープン* /
   RC = sqlite3_open( "test.dbという"、&デシベル);
   {(RC)の場合
      関数fprintf(stderrに、 "開けませんデータベース:%sのを\ n"、sqlite3_errmsg(デシベル));
      出口(0);
   }エルス{
      関数fprintf(stderrに、「開かれたデータベースが正常に\ n ");
   }

   / *マージされたSQL文を作成します* /
   SQLは= "ID = 2 COMPANYから削除します。" \
         「COMPANYからのSELECT * ";

   / * * SQL文を実行/
   RC = sqlite3_exec(デシベル、SQL、コールバック、(void *型)データ、&zErrMsg);
   場合(RC!= SQLITE_OK){
      関数fprintf(stderrに、「SQLエラー:%sの\ nを "、zErrMsg)。
      sqlite3_free(zErrMsg)。
   }エルス{
      関数fprintf(stdoutに、「N \成功した操作 ");
   }
   sqlite3_close(DB)。
   0を返します。
}

上記のプログラムをコンパイルして実行されると、次の結果を生成します。

データベース正常にオープン
ID = 1:と呼ばれるコールバック関数
NAME =ポール
AGE = 32
ADDRESS =カリフォルニア州
SALARY = 20000.0

ID = 3:と呼ばれるコールバック関数
NAME =テディ
AGE = 23
ADDRESS =ノルウェー
SALARY = 20000.0

ID = 4:と呼ばれるコールバック関数
NAME =マーク
AGE = 25
ADDRESS =リッチモンド
SALARY = 65000.0

操作が正常に行われ