Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
SQLite3Test.cpp
[詳解]
1
5
6#include "pch.h"
7#include "SQLite3/Engine.h"
8#include "SQLite3/Statement.h"
9
10using namespace Microsoft::VisualStudio::CppUnitTestFramework;
11using namespace alt;
12
13namespace DBLibraryTest
14{
15 TEST_CLASS (SQLite3Test)
16 {
17 public:
18 TEST_CLASS_INITIALIZE (ClassInitialize)
19 {
20 Logger::WriteMessage ("class initialize.\n");
21 }
22
23 TEST_CLASS_CLEANUP (ClassCleanup)
24 {
25 Logger::WriteMessage ("class cleanup.\n");
26 }
27
28 TEST_METHOD_INITIALIZE (MethodInitialize)
29 {
30 Logger::WriteMessage ("method initialize.\n");
31 }
32
33 TEST_METHOD_CLEANUP (MethodCleanup)
34 {
35 Logger::WriteMessage ("method cleanup.\n");
36 }
37
38 // TIPS
39 // select * from sqlite_master;
40 // type = table
41 // name = <テーブル名>
42 // tbl_name = <テーブル名>
43 // rootpage = 数値
44 // sql = <テーブル作成時のSQL>
45
46 // TIPS データ型の決定方法
47 // @sa https://so-zou.jp/web-app/tech/database/sqlite/data/data-type.htm
48 // カラム型
49 // INTEGER 符号付き整数(1,2,4,8バイト)
50 // TEXT テキスト(UTF-8, UTF-16(BE,LE)
51 // BLOB Binary Large OBject
52 // REAL 浮動小数点(8バイト)
53 // NUMERIC INTEGERまたはREALのどちらか
54
55 // TIPS CREATE TABLE
56 // "CREATE TABLE [IF NOT EXISTS] <スキーマ名>.<テーブル名>(カラム名 カラム型, カラム名 カラム型,…);"
57 // column1 data_type PRIMARY KEY(or FOREIGN KEY, UNIQUE, CHECK)
58 // column2 data_type NOT NULL,
59 // column3 data_type DEFAULT 0,
60 // @sa https://seraphy.hatenablog.com/entry/20061031/p1
61 // @sa https://www.sqlitetutorial.net/sqlite-create-table/
62
63 // CREATE TABLE IF NOT EXISTS T_DOBLEKEY (
64 // ID INTEGER NOT NULL,
65 // SUB-ID INTEGER NOT NULL,
66 // ...
67 // PRIMARY KEY (ID, SUB-ID)
68 // );
69
70 // CREATE [UNIQUE] INDEX index_name ON table_name(column_list);
71
72 TEST_METHOD (SQLite3Test1)
73 {
74 bool ret;
75 db::Engine engine;
76
77 ret = engine.Create (_T ("TestData.db"));
78 Assert::IsTrue (ret, engine.GetErrorMessage ());
79
81 LPCSTR lpcszSQL1 = "CREATE TABLE IF NOT EXISTS TESTTBL(IDX INTEGER PRIMARY KEY, VAL1 VARCHAR, VAL2 NUMBER, VAL3 TEXT);";
82 ret = engine.Execute (lpcszSQL1);
83 Assert::IsTrue (ret, engine.GetErrorMessage ());
84
85 LPCSTR lpcszSQL2 = "DELETE FROM TESTTBL;";
86 ret = engine.Execute (lpcszSQL2);
87 Assert::IsTrue (ret, engine.GetErrorMessage ());
88
89 ret = engine.BeginTransaction ();
90 Assert::IsTrue (ret, engine.GetErrorMessage ());
91
92 db::Statement statement;
93
94 LPCTSTR lpctszSQL3 = _T ("INSERT INTO TESTTBL(VAL1, VAL2, VAL3) VALUES(?, ?, ?)");
95 ret = statement.Prepare (engine, lpctszSQL3);
96 Assert::IsTrue (ret, engine.GetErrorMessage ());
97
98 for (int i = 0; i < 20; i++)
99 {
100 ret = statement.Bind (1, i);
101 Assert::IsTrue (ret, engine.GetErrorMessage ());
102 if (i % 3 == 0)
103 {
104 ret = statement.Bind (2, i * 10);
105 Assert::IsTrue (ret, engine.GetErrorMessage ());
106 }
107 TCHAR tszDateTime[80];
108 SYSTEMTIME T;
109 GetLocalTime (&T);
110 wsprintf (tszDateTime, _T ("%04d/%02d/%02d %02d:%02d:%02d.%03d"), T.wYear, T.wMonth, T.wDay, T.wHour, T.wMinute, T.wSecond, T.wMilliseconds);
111 ret = statement.Bind (3, tszDateTime);
112 Assert::IsTrue (ret, engine.GetErrorMessage ());
113
114 int response = statement.Execute ();
115 Assert::AreEqual<int> (SQLITE_DONE, response, engine.GetErrorMessage ());
116
117 TCHAR tszRow[20];
118 wsprintf (tszRow, _T ("ROWID:%I64u\n"), engine.GetLastRowID ());
119 Logger::WriteMessage (tszRow);
120
121 ret = statement.ResetBind ();
122 Assert::IsTrue (ret, engine.GetErrorMessage ());
123 }
124
125 ret = statement.Finalize ();
126 Assert::IsTrue (ret, engine.GetErrorMessage ());
127
128 ret = engine.CommitTransaction ();
129 Assert::IsTrue (ret, engine.GetErrorMessage ());
130
131 db::Statement statement2;
132
133 LPCTSTR lpctszSQL4 = _T ("SELECT IDX, VAL1, VAL2, VAL3 FROM TESTTBL ORDER BY IDX");
134 ret = statement2.Prepare (engine, lpctszSQL4);
135 Assert::IsTrue (ret, engine.GetErrorMessage ());
136
137 int columnCount = statement2.GetColumns ();
138 for (int col = 0; col < columnCount; col++)
139 {
140 TCHAR tszMsg[128];
141 wsprintf (tszMsg, _T ("%d %s %s\n"),
142 col,
143 statement2.GetColumnName (col),
144 statement2.GetColumnType (col));
145 Logger::WriteMessage (tszMsg);
146 }
147
148 for (;;)
149 {
150 int response = statement2.Execute ();
151 if (response == SQLITE_DONE) break;
152
153 int idx = statement2.GetIntValue (0);
154 LPCSTR lpcszVal1 = statement2.GetStringValue (1);
155 LPCSTR lpcszVal2 = statement2.GetStringValue (2);
156 LPCTSTR lpctszVal3 = statement2.GetString16Value (3);
157
158 TCHAR tszMsg[128];
159 wsprintf (tszMsg, _T ("%d\t%S\t%S\t%s\n"), idx, lpcszVal1, lpcszVal2, lpctszVal3);
160 Logger::WriteMessage (tszMsg);
161 }
162
163 ret = statement2.Finalize ();
164 Assert::IsTrue (ret, engine.GetErrorMessage ());
165
166 ret = engine.Close ();
167 Assert::IsTrue (ret, engine.GetErrorMessage ());
168 }
169 };
170}
SqLite3操作クラス(Engine)
SqLite3操作クラス(Statement)
プリコンパイル済みヘッダー ファイルです。
SqLite3操作クラス(Engine)
Definition: Engine.h:19
ULONGLONG GetLastRowID()
最後の実行時のROWIDを取得
Definition: Engine.h:90
LPCTSTR GetErrorMessage()
エラーメッセージの取得
Definition: Engine.h:36
bool Close()
DBファイルのクローズ
Definition: Engine.h:50
bool BeginTransaction()
トランザクション開始
Definition: Engine.h:66
bool CommitTransaction()
トランザクションコミット
Definition: Engine.h:72
bool Create(LPCTSTR lpctszDBName)
DBファイルの作成・オープン
Definition: Engine.h:43
bool Execute(LPCSTR lpcszSQL)
SQLステートメント実行
Definition: Engine.h:59
SqLite3操作クラス(Statement)
Definition: Statement.h:20
LPCTSTR GetColumnType(int position)
カラムタイプの取得
Definition: Statement.h:162
LPCTSTR GetString16Value(int position)
行データの取得
Definition: Statement.h:202
LPCTSTR GetColumnName(int position)
カラム名の取得
Definition: Statement.h:155
int GetColumns()
カラム数の取得
Definition: Statement.h:148
bool ResetBind()
バインドのリセット
Definition: Statement.h:136
bool Prepare(Engine engine, LPCTSTR lpctszSQL)
SQLステートメントの準備
Definition: Statement.h:42
bool Bind(int position)
パラメータのバインド処理
Definition: Statement.h:54
bool Finalize()
終了処理
Definition: Statement.h:211
bool Execute()
ステートメント実行
Definition: Statement.h:126
int GetIntValue(int position)
行データの取得
Definition: Statement.h:170
LPCSTR GetStringValue(int position)
行データの取得
Definition: Statement.h:194
TEST_CLASS(DBLibraryTest)
Definition: DBLibrary.h:12
#define SQLITE_DONE
Definition: sqlite3.h:456