Visual Studio 2015 で用意したプロジェクトで SQLite3 を使う方法の備忘録
いろいろなサイトで解説されていますが、2015 で C++ のプロジェクトを使った説明をあまり見かけることが無い様子なので、残して於こう!と言う試み
準備
SQLite.org のサイトの Download から、
Source Code の sqlite-amalgamation-XXXXXXX.zip
Precompiled Binaries for Windows の sqlite-dll-win32-x86-XXXXXXX.zip
をダウンロードしてきます
起草時のバージョンは 3140200 でした
sqlite-amalgamation-XXXXXXX.zip はヘッダーファイルが含まれています
sqlite-dll-win32-x86-XXXXXXX.zip は、.def と .dll が含まれています
sqlite3.h,sqlite3.c,sqlite3ex.h と、(ヘッダーだけでも大丈夫かな?)
sqlite3.def,sqlite3.dll を、プロジェクトファイル (.vcxproj) のあるディレクトリーにコピーします
今回は、32bit の DLL を利用しました
.lib の作成
C:\Users\user\Documents\Visual Studio 2015\Projects\xxxxxx_test1\xxxxxx_test1>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\lib.exe" /DEF:sqlite3.def /MACHINE:x86 /OUT:sqlite3.lib
Microsoft (R) Library Manager Version 14.00.24215.1
Copyright (C) Microsoft Corporation. All rights reserved.
ライブラリ sqlite3.lib とオブジェクト sqlite3.exp を作成中
C:\Users\user\Documents\Visual Studio 2015\Projects\xxxxxx_test1\xxxxxx_test1>
sqlite3.lib が出来ますので、ソリューションエクスプローラーから、プロジェクトに追加します
外部依存関係 に追加しても、ヘッダーファイル に追加されます
.
ソースのサンプル
フォーム付きのプロジェクトですので、余計なコードも付いてますが悪しからず..
あと、文字コードのキャストも今ひとつ…
#include "Form1.h"
#include <string>
#include <vector>
#include <iostream>
#include <sstream>
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include "sqlite3.h"
using namespace xxxxxx_test1;
using namespace std;
using namespace System;
using namespace System::Windows::Forms;
[STAThreadAttribute]
int main() {
int status = SQLITE_OK;
::sqlite3* dbh = NULL;
String ^errmsg;
char* errorMessage;
const char* tblCreate = "CREATE TABLE test ( id INTEGER PRIMARY KEY);";
status = ::sqlite3_open("test.sqlite3", &dbh);
if (status != SQLITE_OK) {
errmsg = gcnew String(sqlite3_errmsg(dbh));
MessageBox::Show(errmsg,"SQLite Error",MessageBoxButtons::OK,MessageBoxIcon::Exclamation);
}
status = ::sqlite3_exec(dbh, tblCreate, NULL, NULL, &errorMessage);
if (status != SQLITE_OK) {
errmsg = gcnew String(errorMessage);
MessageBox::Show(errmsg,"SQLite Error", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
}
xxxxxx_test1::Form1 ^form = gcnew xxxxxx_test1::Form1();
form->ShowDialog();
::sqlite3_close(dbh);
return 0;
}
サンプルなので、簡単に書いてます
一応、出来てるようです
見て判るとおり、二度目の実行時には、テーブル test が既に有りますのでエラーします
キチンと MessageBox にエラーが表示されますので、エラーの処理もこんな感じから拡張していけば良いのかな…
bind とか prepare を追記予定