かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

[C#][SQLite]System.Data.SQLiteを試してみた

Ruby on Railsをかじってたときに、SQLiteという超手軽なデータベースがあるのは知ってたけど、.NETにゃ~あまり関係ないかと思ってました。でも、調べてみると、SQLiteをC#で書き直したという素晴らしいものがあるということに先日気づきました。

参考にしたサイト

ということで、上記サイトに一通り目を通したので、本家を見ながらやってみようと思います。

ダウンロード~インストール

以下のサイトから、最新のSQLite for ADO.NET 2.0をダウンロードします。

本家サイト
http://sqlite.phxsoftware.com/

色々あったのですが、ここではSQLite-1.0.61.0-binaries.zipをダウンロードしました。
image

展開すると、2つのフォルダと1つのhtmファイルが出来ます
image

bin/Designer/install.exeをダブルクリックすると、以下のような画面が表示されるので、チェックをつけてCloseを押します。(さくっと終わるので、本当にインストールされているのか不安になりますが出来てます)
image

Express Editionを使ってる人は注意!!
Express Editionを使ってる人には、以下の制約があります。(因みに私の環境はVS2008 std SP1です)
All Express Editions (except Visual Web Developer) are hard-coded to only allow you to design for Jet and Sql Server Database Files. The only way for SQLite to install its designer is to temporarily replace one of the existing "approved" designers. Therefore, when you install the SQLite designer for one of these express editions, it will temporarily replace the Microsoft Access designer. You can revert back to the Access designer simply by re-running the install.exe program and un-checking the boxes.

Excite翻訳様に聞いた感じだと、Express Editionの場合はAccessのデザイナーをSQLiteのデザイナーに置き換えてしまうことで、Express Editionでも使えるようにしたらしいです。チェックを外すとAccessのデザイナーに戻すことが出来ます。

コンソールアプリケーションでお試し

デザイン時のサポートをインストールしたら「SQLiteSample」という名前でコンソールアプリケーションを作ります。

参照の追加から、System.Data.SQLiteを追加します。(下にSystem.Data.SQLite.Linqという気になるものがあるけどここでは追加しないです)
image

そして、コネクションを開いて閉じるだけの小さなサンプルを作ります。

using System.Data.SQLite;

namespace SQLiteSample
{
    class Program
    {
        static void Main(string[] args)
        {
            // コネクションを開いて閉じるだけ
            using (var conn = new SQLiteConnection("Data Source=Test.db"))
            {
                conn.Open();
                conn.Close();
            }
        }
    }
}

System.Data.SQLiteの接続文字列は、「Data Source=DBファイル名」というとてもシンプル設計になっています。
これを実行して、プロジェクトの下のbin/Debugを見てみると、Test.dbというファイルが作成されます。これがSQLiteのファイルになります。
image

テーブルを作ろう

SQLiteのコネクションを開いて閉じるだけで、勝手にDBファイルが作られることが確認できました。世間のサンプルを見渡してると、そこからCREATE TABLEとかをしてINSERT, SELECT, UPDATE, DELETEをしているものをよく見かけます。

なので、ここでは、SQLiteのデザイン時サポート機能を使ってテーブルを作っていきます!!

サーバーエクスプローラから接続の追加を選択します。
image

SQLite Database Fileを選択します。
image

新しくDBを作成したいのでNewボタンを押します。
image

プロジェクト直下に「Test.db」を作成するようにします。
image

テスト接続に成功したら、OKを押して完了します。そうすると、サーバーエクスプローラにSQLite[Test]というものが追加されます。
image

この状態だと、プロジェクトにTest.dbファイルは追加されていないので、上記手順で新規に作成したTest.dbファイルを既存の項目を追加から、プロジェクトに追加します。
追加したら、出力ディレクトリにコピーの部分を「新しい場合はコピーする」に変更します。
image

次にテーブルを作っていきます。サーバーエクスプローラに戻ってTablesの所で右クリックをして、新しいテーブルの追加を選択します。
image

まだ、開発中の機能だからバグがあったら教えてね!というメッセージが表示されるのでOKを押します。
image

SQL Serverのテーブルを作成するのと、同じ感じのUIなので戸惑うことなく使えます。
image

Personという名前で、列はID: integer(primary key), Name: nvarchar(50), Age: integerの3つを持ったテーブルを作成します。

Tablesの下にPersonテーブルが追加されるので、右クリックメニューから「データの取得」を選択します。
image

テーブルのデータが表示されます。下のようにデータを打ち込むこともできます。
image

プログラムから読もう

テーブルも出来たので、データを読み込んでみようと思います。

プロジェクトにTestDataSetという名前でDataSetを追加します。
image

DataSetのデザイナにサーバーエクスプローラのPersonテーブルをドラッグアンドドロップします。
image

SQL Serverの時と同じようにTableAdapterが出来ます!
image

Mainに、さっきかいた接続するだけのプログラムをさくっと消してTableAdapterを使ってデータをとってくるコードを書きます。

using System;
using SQLiteSample.TestDataSetTableAdapters;

namespace SQLiteSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var ta = new PersonTableAdapter();
            var people = ta.GetData();

            foreach (TestDataSet.PersonRow row in people.Rows)
            {
                Console.WriteLine("{0}, {1}, {2}",
                    row.ID, row.Name, row.Age);
            }
        }
    }
}

実行すると、先ほどデザイナを使ってテーブルに入れたデータが取れているのがわかります。
image

更新も出来るか確認してみます。

using System;
using SQLiteSample.TestDataSetTableAdapters;

namespace SQLiteSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var ta = new PersonTableAdapter();
            var people = ta.GetData();

            foreach (TestDataSet.PersonRow row in people.Rows)
            {
                Console.WriteLine("{0}, {1}, {2}",
                    row.ID, row.Name, row.Age);
            }

            // 田中 一郎さんの年齢を更新
            people[2].Age = 44;
            ta.Update(people);

            // 再取得
            people = ta.GetData();

            // もう一回データを表示
            Console.WriteLine("=================");
            foreach (TestDataSet.PersonRow row in people.Rows)
            {
                Console.WriteLine("{0}, {1}, {2}",
                    row.ID, row.Name, row.Age);
            }
        }
    }
}

ばっちり更新できています。
image

追加もしてみます。さっきのプログラムに続けて以下のコードを追加します。

// 五郎さんを追加して
people.AddPersonRow(4, "田中 五郎", 89);
ta.Update(people);

// データをDBから再取得
people = ta.GetData();

// もう一回データを表示
Console.WriteLine("=================");
foreach (TestDataSet.PersonRow row in people.Rows)
{
    Console.WriteLine("{0}, {1}, {2}",
        row.ID, row.Name, row.Age);
}

実行すると、五郎さんが追加されているのがわかります。
image

Insertのコードは2回実行すると失敗するのでコメントアウトして、次にDeleteの処理を書いて見ます。

// 3番目の人を消して
people.RemovePersonRow(people[2]);
// 更新
ta.Update(people);
// もう一回データを表示
Console.WriteLine("=================");
foreach (TestDataSet.PersonRow row in people.Rows)
{
    Console.WriteLine("{0}, {1}, {2}",
        row.ID, row.Name, row.Age);
}

実行すると、ばっちり3番目の人が消えてることがわかります。

image

まとめ

これはなかなかいいものだ!!

投稿日時 : 2009年6月14日 10:30

Feedback

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2009/06/14 10:37 かずき

いきなり間違えたorz
最後のDeleteのコードは
// 3番目の人を消して
people[2].Delete();
// 更新
ta.Update(people);

// データをDBから再取得
people = ta.GetData();
// もう一回データを表示
Console.WriteLine("=================");
foreach (TestDataSet.PersonRow row in people.Rows)
{
Console.WriteLine("{0}, {1}, {2}",
row.ID, row.Name, row.Age);
}
が正しいですorz

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2009/06/14 11:13 karua

へー、こんなAdapterがあったんですね。
しかし、System.Data 名前空間の下にいるんだ。

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2009/06/14 11:34 かずき

そう、System.Data名前空間の下にいるんですよ…
SQLite.DataAccessとかが妥当だと思うんですけど、今更変えれないんですかね^^;

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2009/06/14 12:22 επιστημη

ちょいと試してもらいたいんですが、

接続文字列に
"Data Source=:memory:"
と設定できますか?

オリジナル(C/C++版)ではdb名を":memory:"とすると
ファイルを作らずメモリ上にdbを作るんですわ。これが便利でねー♪

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2009/06/14 12:53 かずき

トラックバック出すの忘れてた^^;

>επιστημηさん
↓で試してみました。
http://blogs.wankuma.com/kazuki/archive/2009/06/14/175195.aspx

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2009/06/14 13:07 επιστημη

あー、こいつぁ失礼しやした。

オリジナルにカワかぶせたんじゃなくC#にportしたってことなんで、
ひょっとかしたらon-memory-DB機能を端折ってるかなー、とか思ってたす。

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2009/06/14 13:54 倉田 有大

なんとー!
C#でSQLiteがてがるに使えるんですねー
昔は手軽なDBの代わりとして、エクセルファイルに対しDBアクセスしてた思い出が・・

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2009/06/15 6:48 かずき

Excelは、あまりいい思い出がないですw

# C# System.Data.SQLite????????????????????????????????? | ihpsystem.com 2010/04/29 0:44 Pingback/TrackBack

C# System.Data.SQLite????????????????????????????????? | ihpsystem.com

# C# System.Data.SQLite????????????????????????????????? « istb16 blog 2010/10/04 19:37 Pingback/TrackBack

C# System.Data.SQLite????????????????????????????????? « istb16 blog

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2011/09/21 10:41 はのはる

はじめまして
説明のとおりにやってみたのですが、ta.Update(people);
のところで「更新には、変更された行を含む DataRow コレクションが渡されたとき、有効な UpdateCommand が必要です。」というエラーが出てしまいます。
開発環境はWindowsXP personal
MicrosoftVisualStudio 2008
.NETFrameworkVer3.1です
お手数おかけしますがよろしくお願いします。

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2011/09/21 11:30 かずき

追加のところでしょうか?更新のところでしょうか?削除のところでしょうか??
また、TableAdapterの作成はうまくいってますか??

再現手順をちょっと教えてもらえないでしょうか。

ついでに.NET Framework 3.1というバージョンはないと思うのですが、どのバージョンをお使いでしょうか?

# re: [C#][SQLite]System.Data.SQLiteを試してみた 2011/09/21 19:03 はのはる

早速ありがとうございます。.NET Framework 3.5でした。スミマセン。
// 田中 一郎さんの年齢を更新
people[2].Age = 44;
ta.Update(people);
の部分です。
//people[2].Age = 44;をコメントアウトすると、コンソールにデータが表示されます。
なにかわかりますでしょうか?

タイトル  
名前  
Url
コメント