C#メモ データベースをファイルで管理するSQLiteをDLLを読み込んで動かしてみる

C#

データベースが使いたいけど、データベース自体はファイルで持っておきたい…。

Accessがバッチシ!だと思ってたんだけど、Accessはテーブルの列数が最大で255列っていう制限がある。
Office 2010あたりでExcel 2010は列数が255列以上扱えるのに…Accessは255文字の制限があるのは謎…。

で、調べてみたらSQLiteなるものがあるって事で試すことに。
こなあたりが、使ってみようと思ったとこ。

  • とにかくフリー(商用でもOKだそうな)
  • メモリの限り?列を増やせる
  • データベースをファイルで管理する

今回はSQLiteのメソッドをC#で呼び出せるまで。
処理としてはこんな感じ。

  1. sqlite3_openでデータベースを開く(新規作成する)
  2. sqlite3_closeでデータベースを閉じる

まずは、SQLiteのDLLをダウンロードしとく。

  1. ブラウザで次のサイトを開く。
    http://www.sqlite.org/
  2. ページの上の方にあるメニューのうちで"Download"ってリンクをクリックする。
    22422_01
  3. “SQLite Download Page"ってページが開くので、下の方にスクロールしていって…
    22422_02
    “Precompiled Binaries for Windows"って項目のとこにある"sqlite-dll-win32-x86-XXXXXX.zip"ってリンクをクリックする。
    ※XXXXXXは数字
    22422_03
  4. ダウンロードしていいか聞いてくるので、ダウンロードする。
    ※ブラウザによってダウンロードの方法が違うので注意(ちなみに、ここではFirefoxの場合)
    22422_04
  5. ダウンロードしたら圧縮ファイルを展開する。
  6. 展開したらsqlite3.dllとsqlite3.defってファイルがでてくる。
    22422_05
    これを適当なフォルダを作って、とっておく。
    22422_06

んで、コード。
DLLを読み込むためのnamespaceを定義しておく。

using System.Runtime.InteropServices;

次にSQLiteのDLLに入ってるメソッドをC#で使えるようにするクラスを定義。

class SQLite
{
	// SQLiteの処理ステータスを定義
	public enum Result : int
	{
		Normal = 0,   // 正常終了
		Faild = 1,    // エラー終了
		Done = 101    // 処理終了
	}

	// データベース(ファイル)を開く
	[DllImport("sqlite3.dll", EntryPoint = "sqlite3_open")]
	public static extern Result Open(string filename, out IntPtr database);

	// データベース(ファイル)を閉じる
	[DllImport("sqlite3.dll", EntryPoint = "sqlite3_close")]
	public static extern Result Close(IntPtr database);
}

んで、実際にSQLiteを動かすコード。

static void Main(string[] args)
{
	SQLite.Result result = SQLite.Result.Faild;    // 処理ステータス
	IntPtr database = IntPtr.Zero;                // データベース

	try
	{
		string filename = "database.sqlite";    // データベース(ファイル)名

		// DBファイルを開く
		result = SQLite.Open(filename, out database);
		if (result != SQLite.Result.Normal)
		{
			throw new Exception("Open() is faild.");
		}
	}
	catch (Exception ex)
	{
		System.Console.WriteLine(ex.Message);
	}
	finally
	{
		// DBファイルを閉じる
		if (database != IntPtr.Zero)
		{
			SQLite.Close(database);
		}
		System.Console.WriteLine("finished");
	}
}

で、一回コンパイルした上で、exeのあるフォルダにsqlite3.dllとsqlite3.defをコピーする。

22422_11

んで、動かしてみるとこんな感じ。

22422_10

exeのあるフォルダを開いてみると、コードに書いてたデータベース名のファイルができてる。

22422_08

ちなみに、デバッグ実行(F5)すると、2回目からこんな警告が…。
※CtrlキーとF5を同時に押して実行すると大丈夫っぽい。

22422_09

ん~、わからん。
そのうち、調べてみよっと…。

あと…DLLはコンパイルするときにコピーしたいな…。

そんなこんなで、メモってことで。