1. データベース開発
1.1 データとデータ管理
情報とは何ですか?
情報とは、現実世界の在り方や運動状態に対する反応を指します。
データとは何ですか?
データとは、ある媒体上に記録された認識可能な物理的記号のことを指しますが、
データ処理の分野ではその概念が大幅に拡張され、文字で構成されるテキスト形式のデータだけでなく、その他の種類のデータも含まれています(オーディオ、ビデオなど)
情報とデータの関係:
情報とデータは相互に依存しており、データは情報の伝達体であり、情報はデータの内包です。
データ処理とは、データと情報の間の相互変換のプロセスを指します;
データ処理の観点から見ると、情報は特定の形式に加工されたデータの一種です。
データ処理 データ処理
の中核はデータ管理技術です。データ管理技術とは、データを分類、整理、符号化、保存、取得、維持する技術を指します。
データ管理テクノロジーの開発は、手動管理段階、ファイル システム段階、データベース システム段階といういくつかの段階を経てきました。
1.2 データベースシステム
定義: データベース システム (DBS) は、データベースがコンピュータに導入された後のシステム構成を指します。
構成: データベース、オペレーティング システム、データベース管理システム、データベース管理アプリケーション システム、データベース管理者 (DBA)、ユーザー
1.3 データベースシステムモデル
データベース管理システムは、データ モデルに従ってデータを保存および管理します。
データ モデルは、
1 つ目は現実世界をよりリアルにシミュレートできる、
2 つ目は理解しやすい、
3 つ目は実現しやすいという3 つの要件を満たす必要があります。コンピューターで。
データ構造、データ操作、整合性制約はデータ モデルを構成する 3 つの要素です。このうち、データの整合性制約とは、仕様に準拠していないデータをデータベースに登録することを指します。
ユーザーがデータを挿入、変更、または削除すると、DBMS は特定の制約に従ってデータを自動的に監視し、仕様を満たさないデータがデータベースに入力されないようにして、データベースに保存されているデータが正しいことを確認します。効果的で互換性があります。
データベース管理システムのデータ モデル:
データベース管理システムで使用されるデータ モデルには、主に階層モデル、ネットワーク モデル、リレーショナル モデルが含まれます。
階層モデルは典型的な木構造であり、その特徴は、
1. 親ノードを持たないノードが 1 つだけあり、このノードをルートノードと呼ぶ
2. 他のノードには親ノードが 1 つだけある
3.ということが挙げられます。 . 同じ親 ノードの子ノードは兄弟ノードと呼ばれます;
4. 子ノードのないノードはリーフ ノードと呼ばれます。
ネットワークモデルは、階層構造モデルよりも複雑なネットワーク構造を構成しており、
1. 複数のノードが親ノードを持たないことを許容する、2. 1 つのノードが
複数の親ノードを持つことができる、3. 親ノードを持たないノードが存在する、という特徴がある。
リレーショナル モデル データの論理構造は 2 次元のテーブルであり、1 つの行がオブジェクトのメンバー、各列がオブジェクトの属性です。その特徴は次のとおりです:
1. 各列のコンポーネントは同じタイプのデータにすることができます
2. 列の順序は任意にできます
3. 行の順序は任意にできます
4. テーブル内のコンポーネントは最小ですアイテムを分割できないデータ、つまりサブテーブルをテーブル内に含めることはできません。
リレーショナル データベースは、データを編成する方法としてリレーショナル モデルを使用します。リレーショナル データベースは、厳密な数学理論、シンプルで柔軟な使用法、強力なデータ独立性により、最も有望なデータベース管理システムとして認識されており、現在では主流のデータベース管理システムとなっています。
1.4 共通データベース
一般的なデータベースは次のとおりです:
ORACLE、MySQL、SQL サーバー、Access、Sybase、SQLite
1、ORACLE:
ORACLE は、Oracle Corporation によって開発されたデータベースであり、大型、中型、およびマイクロコンピュータに適したリレーショナル データベース管理システムです。データベース言語。
2. MySQL
MySQL は、オープンソースの小規模リレーショナル データベース管理システムです. 開発者はスウェーデンの MySQL AB 社です. 現在、MySQL はインターネット上の小規模および中規模の Web サイトで広く使用されています. サイズが小さく、高速です. 、低コスト、オープンソースコード専門。
3. SQL サーバーは
、Microsoft が開発した実際のクライアント/サーバー アーキテクチャであり、グラフィカル インターフェイスを備えたデータベース ソフトウェアであり、システム管理とデータベース管理をより直観的/シンプルにします。優れたスケーラビリティを備え、Windows 95 /98 タイプの実行から実行できます。コンピュータから Windows 2000 やその他のプラットフォームを実行する大規模なマルチプロセッサまで。
4. Access
Access は、Microsoft がリリースしたリレーショナル データベース管理システムです。MicrosoftJet データベース エンジンとグラフィカル ユーザー インターフェイスの 2 つの特徴を組み合わせたもので、Microsoft Office のシステム プログラムの 1 つです。これはデスクトップ データベースであり、少量のデータを扱うアプリケーションにのみ適しています。少量のデータや 1 台のコンピュータからアクセスされるデータベースを処理する場合には非常に優れており効率的ですが、同時に 4 台を超えるクライアントにはアクセスできません。同じ時間です。Access データベースには一定の制限があり、データが約 100M に達すると、サーバー IIS がフリーズしたり、サーバーのメモリを消費してサーバーがクラッシュしたりする可能性があります。
5.サイベース
Sybase データベース製品には主に 3 つのバージョンがあり、1 つは UNIX オペレーティング システムで実行されるバージョン、もう 1 つは Novell Netware 環境で実行されるバージョン、3 つ目は Windows NT 環境で実行されるバージョンです。Sybase データベースの特徴:
1. クライアント/サーバー アーキテクチャに基づいたデータベース
2. 真にオープンなデータベースであり、移植が容易である;
3. 高性能データベースである。
1.5 SQLiteデータベース
1.5.1 SQLite データベースの概要
SQLite はオープン ソースの組み込みリレーショナル データベースで、最初のバージョンは 2000 年 5 月に誕生し、現在の最新バージョンは SQLite3 です。
ダウンロードアドレス: https: //www.sqlite.org/download.html
インストール方法(Ubuntu環境)
sudo apt-get install sqlite3
インストール方法(WindowsではC++と組み合わせます)
sqlite-amalgamation-3410200.zip(解凍後のヘッダーファイル)、sqlite-dll-win64-x64-3410200.zip、sqlite-dll-win64-x64-3410200.zipの3つのファイルをダウンロードします。そして、それらを同じフォルダー Sqlite3 に解凍し、詳細については次の図を参照してください (ここでは、最初のファイルから解凍されたヘッダー ファイルは含まれていません)、その後、sqlite3.def ファイルから sqlite.lib ファイルを生成します
。 : まず「VS20xx 開発者コマンド プロンプト」を開き、次にコマンド ラインに次のように入力します。
cd D:/Sqlite3
LIB /DEF:sqlite3.def /MACHINE:X64
sqlite.lib ファイルを取得すると、ライブラリの構成方法に従って段階的に操作できます。
SQLite の特徴:
1. ゼロ構成、
2. ポータブル、
3. コンパクト、
4. シンプル、
5. 柔軟性、
6. 信頼性
、7. 使いやすい。
1.5.2 SQL ステートメントの基本
SQL は Structured Query Language の頭字語で、データベースとの通信に特に使用される言語です。現在、SQL は最も広く使用されているデータベース言語となっています。SQL は多くの商用データベース管理システム製品で採用されており、さまざまなデータベース管理システムが実際に SQL 仕様に一定の適応と拡張を行っています。したがって、異なるデータベース管理システム間で SQL 言語を相互に完全に使用することはできません。
SQLite データ型:
一般的なデータは固定の静的データ型を使用しますが、SQLite は格納された値に応じて自動的に判断される動的データ型を使用します。SQLite には次の 5 つの基本データ型があります: 1. 整数: 符号付き整数 (最大 64 ビット); 2. 実数: 8 バイトで表される浮動小数点型; 3. テキスト: 複数のエンコーディングをサポートする文字型 (UTF など) 8、UTF-16)、サイズ無制限; 4、BLOB: あらゆる種類のデータ、サイズ無制限。BLOB (バイナリ ラージ オブジェクト) バイナリ ラージ オブジェクト。バイナリを使用してデータを保存します。 5. Null: Null 値を示します。
データベース ファイルの SQL ステートメント:
1. データベースを作成して開きます: sqlite3 .db プロンプト: .db ファイルが存在しない 場合、sqlite はデータベース ファイルを作成して開きます 。.db ファイルが存在する場合、sqlite はデータベースを開きます。ファイル 2. データベースを終了するコマンド: .quit または .exit
SQL ステートメントの形式:
すべての SQL ステートメントはセミコロンで終わり、SQL ステートメントでは大文字と小文字が区別されません。2 つのマイナス記号「-」はコメントを表します。リレーショナル データの中核となる操作には主に、1. テーブルの作成、変更、削除、2. 行の追加、変更、削除、3. テーブルの検索が含まれます。
1. テーブルを作成します: create ステートメント
//语法:create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,...);
//例子:创建一表格,该表包含3列,列名分别是:"id"、"name"、"addr"
//在终端下输入:
sqlite> create tabel persons(id integer, name text, addr text);
2. テーブルの作成: Create ステートメント (主キーの設定)
sqlite でテーブルを設計する場合、各テーブルは主キーを介して手動で主キーを設定できます。各テーブルは主キーを 1 つだけ持つことができ、列データは主キーとして設定されます。キーを繰り返すことはできません。
//语法:create table 表名称(
列名称1 数据类型 primary key,
列名称2 数据类型,
列名称3 数据类型,...);
//例子:创建一表格,该表包含3列,列名分别是:"id"、"name"、"addr"
//在终端下输入:
sqlite> create tabel persons(id integer primary key, name text, addr text);
3. テーブルの変更
既存のテーブルに列を追加し、テーブル名を変更します。
//语法: alter table 表名 add 列名 数据类型
sqlite> alter table persons add sex text;
//语法: alter table 表名 rename 表名
sqlite> alter table persons rename stu;
4. テーブルの削除は
テーブルの削除に使用されます(テーブルの構造、属性、インデックスも削除されます)。
//语法: drop table 表名;
sqlite> drop table persons;
5. 新しい行を挿入します。insert into ステートメント (すべての代入) は、
行内のすべての列に値を割り当てます。
//语法:insert into 表名 values(列值1,列值2,列值3,列值4,...);
//注意,当列值为字符串时要加上' '号
sqlite> create table persons (id integer, name text, addr text);
sqlite> insert into persons values(1,'lucky','beijing');
6. テーブル内のデータを変更します。更新ステートメントは、
一致条件に従って 1 つ以上の行を検索する場所を使用し、検索結果に従ってテーブル内の対応する行の列数を変更します (変更する列は列名で指定されます)。
//语法:update 表名 set 列1 = 值1 [,列2 = 值2,...][匹配条件]
//匹配:where子句
// where子句用于规定匹配的条件。
//操作符 描述
// = 等于
// <> 不等于
// > 大于
// < 小于
// >= 大于等于
// <= 小于等于
//匹配条件语法: where 列名 操作符 列值
sqlite> update persons set id=2, addr = 'tianjin' where name = 'peter';
7. テーブル内のデータを削除します。削除ステートメントは、
一致条件に従って 1 つ以上の行を検索する場所を使用し、検索結果に従ってテーブル内で見つかった行を削除します。
//语法:delete from 表名 [匹配条件]
//注意:当表中由多列、多行符合匹配条件时会删除相应的多行
sqlite> delete from person where name = 'peter';
8. クエリ: select ステートメント (基本) を
使用してテーブルからデータを選択し、結果を結果テーブル (結果セットと呼ばれます) に保存します。
//语法1:select * from 表名 [匹配条件];
//语法2:select 列名1[,列名2,...] from 表名 [匹配条件];
//提示:星号(*)是选取所有列的通配符
sqlite> select * from persons;
sqlite> select name from person where id = 1;
8. 一致条件の構文: (改善)
データベースは、さまざまな一致方法を実現するための where 句を備えた豊富な演算子を提供します。
例: (1) 演算子内 (2) および演算子 (3) または演算子 (4) 演算子と演算子の間 (5) 演算子と同様 (6) 演算子ではない
// in允许我们在where子句中规定多个值
// 匹配条件语法:where 列名 in (列值1,列值2,...)
// 例:1、select * from 表名 where 列名 in (值1,值2,...);
// 2、select 列名1[,列名2,...] from 表名 where 列名 in(列值1,列值2,...);
sqlite> select * from persons where id in (1,2);
sqlite> select name from persons where id in (1,2);
// and 可在where子语句中把两个或多个条件结合起来(多个条件之间是与的关系)
// 匹配条件语法:where 列1 = 值1 [and 列2 = 值2 and...]
// 例: 1、select * from 表名 where 列1 = 值1 [and 列2 = 值2 and ...];
// 2、select 列名1[,列名2,...] from 表名 where 列1 = 值1 [and 列2 = 值2 and ...];
sqlite> select * from persons where id = 1 and addr = 'beijing';
sqlite> select name from persons where id = 1 and addr = 'beijing';
//or可在where子语句中把两个或多个条件结合起来(多个条件之间是或的关系)
// 匹配条件语法:where 列1 = 值1 [or 列2 = 值2 or...]
// 例: 1、select * from 表名 where 列1 = 值1 [or 列2 = 值2 or ...];
// 2、select 列名1[,列名2,...] from 表名 where 列1 = 值1 [or 列2 = 值2 or ...];
sqlite> select * from persons where id = 1 or addr = 'beijing';
sqlite> select name from persons where id = 1 or addr = 'beijing';
//操作符between A and B会选介于A、B之间的数据范围。这些值可以是数值、文本或日期
//注意:不同的数据库对between A and B操作符的处理方式是有差异的(有的包含A,B,有的不包含A,B,有的只包含一边)
// 匹配条件语法:where 列名 between A and B
// 例: 1、select * from 表名 where 列名 between A and B;
// 2、select 列名1[,列名2,...] from 表名 where 列名 between A and B;
// 注:匹配字符串时会以ascii顺序匹配
sqlite> select * from persons where id between 1 and 3;
sqlite> select name from persons where id between 1 and 3;
//like 用于模糊查找
// 匹配条件语法:where 列名 like 列值
// 若列值为数字,相当于列名=列值
// 若列值为字符串,可以用通配符“%”代表缺少的字符(一个或多个)
sqlite> select * from persons where id like 3;
sqlite> select * from persons where addr like "%jing%";
//not 可取出原结果集的补集
//匹配条件语法:where 列名 not in 列值 等
//例: 1、where 列名 not in (列值1,列值2,...);
// 2、where not(列1 = 值1 [and 列2 = 值2 and...])
// 3、where not(列1 = 值1 [or 列2 = 值2 or...])
// 4、where 列名 not between A and B
// 5、where 列名 not like 列值
// order by 语句根据指定的列对结果集进行排序(默认按照升序对结果集进行排序,可使用desc关键字按照降序对结果集进行排序)
// 例:升序
// select * from 表名 order by 列名
// 降序
// select * from 表名
9. テーブルをコピーし、テーブル構造を変更します。
//1、复制一张表
create table tbl2 as select * from tbl1;
//2、复制一张表的部分内容
create table tbl2 as select * from tbl1 where id =104;
//3、修改表的结构
//第一步:创建新表
create table ntbl(id interger,name text,addr text);
//第二步:导入数据(如果有主键,要注意数据不要重复)
insert into ntbl(id,name,addr) select id,name,addr from tbl1;
//第三步:修改表名
alter table ntbl rename tbl1;
10. トランザクション
トランザクションは、BEGIN TRANSACTION コマンドまたは単純な BEGIN コマンドを使用して開始できます。このようなトランザクションは通常、次の COMMIT または ROLLBACK コマンドが検出されるまで実行を続けます。ただし、データベースがシャットダウンされた場合やエラーが発生した場合にも、トランザクションはロールバックされます。以下は、トランザクションを開始する簡単な構文です。
SQLite では、デフォルトで、各 SQL ステートメントは独自のトランザクションになります。 begin: トランザクションを開始し、後続のすべての操作をキャンセルできます commit: 開始後にすべてのコマンドを確認します rollback: begin 後にすべての操作をキャンセルします 例: sqlite->begin; sqlite->delete from people
1.5.3 SQL ステートメントの詳細
1. 関数と集計
関数: SQL ステートメントは、データを処理するための関数の使用をサポートしています。関数は通常、データに対して実行されるため、データの変換と処理が容易になります。
一般的に使用されるテキスト処理関数は次のとおりです: length() 文字列の長さを返します lower() 文字列を小文字に変換します upper() 文字列を大文字に変換します 構文: テーブル名から関数名 (列名) を選択します; 一般的に使用される集計関数:集計関数を使用して、分析およびレポート生成用のデータを取得します。 avg() は列の平均値を返します。 count() は 列の行数を返します。 max() は 列の最大値を返します。 min() は列 の最小値を返します。列の値 sum() は、特定の列の値の合計を返します2. データのグループ化 テーブルの内容のサブセットを要約できるようにデータをグループ化することにより、集計関数と組み合わせてよく使用されます。たとえば、各クラスの人数、平均人数などをクエリします。 使用方法: 列名ごとにテーブル名グループから列名 1[,列名 2,...] を選択します。
sqlite>select class,count(*) from persons group by class;
3. フィルタのグループ化
データをグループ化するために group by を使用することに加えて、どのグループが含まれ、どのグループが除外されるかを認識することもできます。
使用方法: 関数名制限値を持つ列名ごとにテーブル名グループから関数名 (列名 1[)、列名 2、...] を選択します。
//查看班级平均分大于90的班级
sqlite>select class,avg(score) from persons group by class having avg(score) >= 90
4. 制約管理
データベース データの挿入または処理 方法に関するルール 、チェック制約 一意制約主
共通の制約分類: 主キーを更新しないでください。更新しない場合、主キーには、 タイムスタンプ、作成時刻列など、動的に変化するデータが含まれるべきではありません。主 キーはコンピュータによって自動的に生成される必要があります (一意性を確保するため)。 構文: create table テーブル名 ( 列名 1 データ型主キー、列名 2 データ型、列名 3 データ型、。 ..);
一意制約:
列 (または列のグループ) 内のデータが一意であること、主キーに似ているが主キーとは異なることを確認するために使用されます。テーブルには複数の一意制約を含めることができますが、主キーの一意制約は 1 つだけ です
。 table の作成時に
列を変更または更新できます
。構文は unique で設定します
。 create table table name (列名 1 データ型 unique[, 列名 2 データ型 unique,...]);
チェック制約:
列 (または一連の列) 内のデータが一連の指定された条件を満たしていることを確認するために使用されます。
範囲指定、最大範囲または最小範囲の確認、
作成テーブルテーブル名(列名のデータ型チェック(判定文))のチェックを実施します。
5.
ジャンクションテーブル(マルチテーブル操作)の概念: データを保存する際、すべてのデータが1つのテーブルに格納されるのではなく、複数のテーブルに格納されることがよくありますが、ジャンクションテーブルは複数のテーブルのデータをクエリするものです。テーブル内のデータを分解するのは不便で、同じデータが複数回出現してストレージ スペースを無駄にすることが容易です。ジャンクション テーブルを使用して各データを表示する方が直観的であり、データの処理が容易になります。 。
例えば、学生の年間テストの成績や学生の個人情報(学籍番号、氏名、住所など)は基本的に固定されており、すべての情報を同じ表に入れると必然的に学籍番号などの基本情報が重複してしまいます。
サブテーブルの利点:
学生情報と成績の個別の保存、スペースの節約、簡単な処理、特に大量のデータを処理する場合の効率の向上、リレーショナル
データベースを使用してデータを保存する場合、各テーブルの設計は非常に重要で優れていますテーブル設計により、データ処理が簡素化され、効率が向上し、データベースの堅牢性が向上します。
join を使用する:
select ステートメントで結合するすべてのテーブルとそれらがキーである方法
よく使用されるステートメント:
select カラム名 1, カラム名 2, ... from table 1, table 2... where 判定ステートメント;
select * from tbl1, tbl2 (tbl1.id = tbl2.id)
sqlite> select name, addr, score, year from persons, grade where persons.id = grade.id and name = 'lucy';
6. ビュー (仮想テーブル) は
SQL ステートメントを再利用し、
複雑な SQL 操作 (以前の複数テーブル クエリなど) を簡素化します。
sqlite> select name, addr, score, year from persons, grade where persons.id = grade.id and name = 'lucy';
ビューを使用してクエリ全体を PersonGrade という名前の仮想テーブルにラップします。これにより、クエリの SQL ステートメントが簡素化されます。
sqlite> create view PersonGrade as select name, addr, score, year from persons, grade where persons.id = grade.id and name = 'lucy';
sqlite> select * from PersonGrade;
ビューの削除: 構文: ドロップ ビュー ビュー名;概要: 1. ビューにはデータが含まれていないため、ビューが使用されるたびにクエリを実際に実行する必要があります; 2. ビューは、as when の後の SQL ステートメントと同等です。 3. 返された結果情報(ビュー)からテーブルと同じビューを取得します。
7. トリガーの
概念: SQLite のトリガーはデータベースのコールバック関数であり、指定されたデータベース イベントが発生したときに自動的に呼び出しを実行します; 1. 削除、挿入、または更新操作が実行された場合にのみ、指定された 1 つをトリガーして実行します。または複数の SQL ステートメント。(たとえば、人物テーブルのルーシー情報を削除するときに、成績テーブルのルーシー関連情報も自動的に削除するようにトリガーを設定できます) 2. トリガーはデータの一貫性を確保するためによく使用され、テーブルが更新または削除されるたびに 、記録される ログ テーブルに書き込む トリガーを作成する: 構文: create trigger トリガー名 [前/後] [挿入|更新|削除] on テーブル名 begin ステートメント; 終了; 例: 説明: 実行時: ID が指定されている人物から削除= 1; ステートメントが作成されると、イベントがトリガーされ、begin と end の間の SQL ステートメント (つまり、コールバック関数) が実行されます 。 old.id は削除された行の ID を表します (ID は 2 つのテーブルの関連する列を表します)。
create trigger tg_delete after delete on persons begin delete from grade where id = old.id;
8. クエリ効率を向上させる SQLite ログ操作とインデックス操作は
ログに書き込まれます:sqlite> create table log (time text, data text);
ここで、挿入時に time('now') と date('now') の 2 つの関数が使用されることに注意してください。例
:sqlite> insert into log values(time('now'),date('now'));
トリガーと組み合わせてよく使用されます。動作変更時刻の記録に使用します。
クエリ最適化インデックス: データベースには大量のデータが保存されることが多く、通常のクエリのデフォルトの方法は順次スキャンを呼び出すことです。たとえば、次のようなクエリ: select * from table where id = 10000; インデックスがない場合は、ID が 10000 の行が見つかるまでテーブル全体を走査する必要があります。クエリの効率を向上させるためにインデックスを使用できますが、
インデックスとは何ですか? インデックスは、データベース テーブル内の 1 つ以上の列の値を並べ替える構造です。インデックスを使用すると、データ テーブル内の特定の情報にすばやくアクセスできます。インデックスは、特定のアルゴリズムによって最適化された適切な並べ替えであるため、検索回数 がはるかに少ないこと 多いこと; 欠点: インデックス データは多くのストレージ領域を占有する可能性があるため、すべてのデータがインデックス作成に適しているわけではありません。 インデックス作成により、取得操作のパフォーマンスは向上しますが、データの挿入、変更、および削除; インデックスの作成: 構文: create Index テーブル名 (列名) のインデックス名; インデックスの表示: .indices インデックスの削除: インデックスのインデックス名を削除; ターミナルに入力 (id 列はインデックスを作成して並べ替えます):インデックスの作成 注: 1.主キーとなる列に インデックスを作成する; 2.ソートが必要なことが多い列にインデックスを作成する; 3.WHERE句でよく使用する列にインデックスを作成して条件の判定を高速化します。
create index id_index on persons(id);
インデックスの使用を避ける: 1. テーブル内のデータ量が多くない; 2. テーブルに対する操作のほとんどがクエリではない; 3. 大量の NULL が表示される
1.6 SQLite C プログラミング
1.6.1 データベース関数のオープンとクローズ
int sqlite3_open(char *db_name, sqlite3 **db);
功能:
打开数据库
参数:
db_name: 数据库文件名,若文件名包含ASCII码表范围之外的字符,则其必须是utf-8编码
sqlite3: 数据库标识,此结构体为数据库操作句柄。通过此句柄可对数据库文件进行相应操作。
返回值:
成功返回SQLITE_OK,失败返回非SQLITE_OK
int sqlite3_close(sqlite3 *db);
功能:
关闭数据库、释放打开数据库时申请的资源
参数:
db: 数据库的标识
返回值:
成功返回SQLITE_OK
失败返回非SQLITE_OK
注意:
sqlite3使用了两个库:pthread、dl,故链接时应加上-lpthread和-ldl
1.6.2 sqlite3でSQL文を実行する方法(コールバック方式)
sqlite3_exec函数:
int sqlite3_exec(sqlite3 *db,const char *sql,exechandller_t callback,void *arg,char **errmsg);
功能:
执行sql执向的SQL语句,若结果集不为空,函数会调用函数指针callback所指向的函数。
参数:
db: 数据库的标识
sql: SQL语句(一条或多条),以‘;’结尾
callback: 是回调函数指针,当这条语句执行之后,sqlite3会去调用你提供的这个函数
arg: 当执行sqlite_exec的时候传递给回调函数的参数;
errmsg: 存放错误信息的地址,执行失败后可以查阅这个指针;
打印错误信息方法:printf("%s\n",errmsg);
返回:
回调函数指针:
typedef int (*exechandller_t)(void *para,int n_column,char ** column_value,char **column_name);
功能:
此函数由用户定义,当sqlite3_exec函数执行sql语句后,结果集不为空时,sqlite3_exec函数会自动调用此函数,每次调用此函数时会把结果集的一行信息传递给此函数。
参数:
para: sqlite3_exec传给此函数的参数,para为任意数据类型的地址;
n_column: 结果集的列数;
column_value: 指针数据的地址,其存放一行信息中各个列值的首地址;
column_name:指针数据的地址,其存放一行信息中各个列值对应列名的首地址
返回值:
若为非0值,则通知sqlite3_exec终止回调
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sqlite3.h"
int loadinfo(void *data,int col, char **col_val,char **name){
static int row = 1;
printf("row= %d\n",row++);
for(int i = 0; i < col; i++)
{
printf("%s = %s \n",name[i], val[i]);
}i
return SQLITE_OK;
}
int main(int argc, char ** argv){
sqlite3 *db = NULL;
int ret;
char *err = NULL;
char *sql;
int arg = 33;
ret = sqlite3_open("stu.db", &db);
if(ret != SQLITE_OK){
printf("open error\n");
return -1;
}
sql = "insert into info values(120,'zz','ts')";
sqlite3_exec(db, sql, loadinfo,&arg,&err);
if(err){
printf("err:%s\n",err);
}
sqlite3_close(db);
return 0;
}
1.6.3 sqlite3でSQL文を実行する方法(非コールバック方式)
sqlite3_get_table函数
int sqlite3_get_table(sqlite3 *db,const char *sql,char ***resultp,int *nrow,int *ncolumn,char **errmsg);
功能:
执行sql指向的sql语句,函数将结果集相关的数据的地址保存在函数的参数中。
参数:
db: 数据库的标识;
sql: SQL语句(一条或多条),以’;‘结尾;
resultp: 指针数据的地址,其记录了结果集的数据。内存布局:先依次存放各列的列名,然后是每一行各列的值
nrow: 结果集的行数(不包含列名)
ncolumn: 结果集的列数
errmsg: 错误信息
sqlite3_free_table函数:
void sqlite3_free_table(char (** resultp);
功能:
释放sqlite3_get_table分配的内容
参数:
结果集数据的首地址
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "sqlite3.h"
int main(int argc, char ** argv){
sqlite3 *db = NULL;
int ret;
char *err = NULL;
char *sql;
char **result;
int row,col;
ret = sqlite3_open("stu.db", &db);
if(ret != SQLITE_OK){
printf("open error\n");
return -1;
}
sql = "insert into info values(120,'zz','ts')";
sqlite3_get_table(db, sql, &result,&row,&col,&err);
if(err){
printf("err:%s\n",err);
sqlite3_close(db);
return -1;
}
//处理读取到的数据
for(int i = 0; i < row * col; i++){
printf("result[%d] = %s\n", i , result[i]);
}
sqlite3_free_table(result);
sqlite3_close(db);
return 0;
}