<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>SQLite</title><link>http://blogs.wankuma.com/kazuki/category/2151.aspx</link><description>SQLite</description><managingEditor>k.ota.0130あっとgmail.com(かずき)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C#][SQLite]System.Data.SQLiteを試してみた その３「トランザクションの有無による性能」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/06/14/175202.aspx</link><pubDate>Sun, 14 Jun 2009 14:43:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/06/14/175202.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/175202.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/06/14/175202.aspx#Feedback</comments><slash:comments>533</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/175202.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/175202.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/kazuki/archive/2009/06/14/175195.aspx"&gt;前のエントリ&lt;/a&gt;で&lt;a href="http://blogs.wankuma.com/episteme/"&gt;επιστημη&lt;/a&gt;さんから、追試依頼が来たので追試！&lt;/p&gt; &lt;p&gt;追試の内容は&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;DBの更新が連続するとき、TRANSACTIONで囲まないとえらく遅いんすよオリジナルは。 &lt;br&gt;.NET-port版ではどうだか知りたいっす。&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;ということなので、さくっとやってみました。実験したコードは以下の通りです。&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d3b5d73b-3b4e-4ef1-991a-ec43b81b2ccc" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;using System;
using SQLiteSample.TestDataSetTableAdapters;
using System.Data.SQLite;
using System.Diagnostics;

namespace SQLiteSample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var conn = new SQLiteConnection("Data Source=Tran.db"))
            {
                conn.Open();

                Console.WriteLine("CREATE TABLE...");
                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "CREATE TABLE Person( " +
                        "  ID integer primary key, " +
                        "  Name nvarchar(50), " +
                        "  Age integer)";
                    var ret = command.ExecuteNonQuery();
                    Console.WriteLine(ret);
                }

                Console.WriteLine("INSERT...");
                var watch = new Stopwatch();
                watch.Start();
                //using (var tran = conn.BeginTransaction())
                //{
                    using (var command = conn.CreateCommand())
                    {
                        command.CommandText = "INSERT INTO Person(ID, Name, Age) VALUES (@id, @name, @age)";
                        command.Parameters.Add("id", System.Data.DbType.Int64);
                        command.Parameters.Add("name", System.Data.DbType.String);
                        command.Parameters.Add("age", System.Data.DbType.Int64);

                        for (int i = 0; i &amp;lt; 1000; i++)
                        {
                            command.Parameters["id"].Value = i;
                            command.Parameters["name"].Value = "田中　太郎" + i;
                            command.Parameters["age"].Value = i % 50;
                            command.ExecuteNonQuery();
                        }
                    }
                    //tran.Commit();
                //}
                watch.Stop();

                Console.WriteLine(watch.ElapsedMilliseconds); 
                conn.Close();
            }
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;とりあえず１０００件のデータをトランザクション無しで放り込んでみると…。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSystem.Data.SQLite_C3D7/image.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSystem.Data.SQLite_C3D7/image_thumb.png" width="157" height="132"&gt;&lt;/a&gt;&amp;nbsp;&lt;br&gt;約1分かかりました。&lt;/p&gt;
&lt;p&gt;次にトランザクション有りで。トランザクション無し版のコードでコメントになってるトランザクションの処理をコメントアウトして実行しました。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSystem.Data.SQLite_C3D7/image_3.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSystem.Data.SQLite_C3D7/image_thumb_3.png" width="158" height="144"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;本当は5回計測して一番上と下の値を抜いて平均出そうとしたけど、圧倒的に違ったので1回目で計測終了。&lt;/p&gt;
&lt;p&gt;ということで、オリジナルのSQLiteと同じで、大量のデータをINSERTしたりするときは毎回トランザクションが開始されてしまいものすごい性能が劣化してしまうようです。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/175202.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C#][SQLite]System.Data.SQLiteを試してみた その２「:memory:」</title><link>http://blogs.wankuma.com/kazuki/archive/2009/06/14/175195.aspx</link><pubDate>Sun, 14 Jun 2009 12:52:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/06/14/175195.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/175195.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/06/14/175195.aspx#Feedback</comments><slash:comments>355</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/175195.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/175195.aspx</trackback:ping><description>&lt;p&gt;前のエントリで、&lt;a href="http://blogs.wankuma.com/episteme/"&gt;επιστημη&lt;/a&gt;さんから、接続文字列をData Source=:memory:にすると、インメモリなDBになるかどうか確認してほしいというコメントがあったのでやってみました。&lt;br&gt;オリジナル版のSQLiteでは、インメモリDBになるらしい。&lt;/p&gt; &lt;p&gt;ということで、さくっと実験です。&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:466f879a-6991-457f-bb01-8b77afc94d75" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;using System;
using SQLiteSample.TestDataSetTableAdapters;
using System.Data.SQLite;

namespace SQLiteSample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var conn = new SQLiteConnection("Data Source=:memory:"))
            {
                conn.Open();

                Console.WriteLine("CREATE TABLE...");
                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "CREATE TABLE Person( " +
                        "  ID integer primary key, " +
                        "  Name nvarchar(50), " +
                        "  Age integer)";
                    var ret = command.ExecuteNonQuery();
                    Console.WriteLine(ret);
                }

                Console.WriteLine("INSERT...");
                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "INSERT INTO Person(ID, Name, Age) VALUES (@id, @name, @age)";
                    command.Parameters.Add("id", System.Data.DbType.Int64);
                    command.Parameters.Add("name", System.Data.DbType.String);
                    command.Parameters.Add("age", System.Data.DbType.Int64);

                    for (int i = 0; i &amp;lt; 10; i++)
                    {
                        command.Parameters["id"].Value = i;
                        command.Parameters["name"].Value = "田中　太郎" + i;
                        command.Parameters["age"].Value = i % 50;
                        var ret = command.ExecuteNonQuery();
                        Console.WriteLine(ret);
                    }
                }

                Console.WriteLine("SELECT...");
                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "SELECT ID, Name, Age FROM Person ORDER BY ID";
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine("{0}, {1}, {2}",
                                reader["ID"], reader["Name"], reader["Age"]);
                        }
                    }
                }
                
                conn.Close();
            }
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;コネクション開いて、テーブル作って、データ投入して、表示してます。&lt;br&gt;ばっちり動いてくれました。&lt;/p&gt;
&lt;p&gt;因みに実行結果は下の通り。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSystem.Data.SQLitememory_B4EB/image.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSystem.Data.SQLitememory_B4EB/image_thumb.png" width="90" height="244"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/175195.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C#][SQLite]System.Data.SQLiteを試してみた</title><link>http://blogs.wankuma.com/kazuki/archive/2009/06/14/175189.aspx</link><pubDate>Sun, 14 Jun 2009 10:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/06/14/175189.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/175189.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/06/14/175189.aspx#Feedback</comments><slash:comments>5446</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/175189.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/175189.aspx</trackback:ping><description>&lt;p&gt;Ruby on Railsをかじってたときに、SQLiteという超手軽なデータベースがあるのは知ってたけど、.NETにゃ～あまり関係ないかと思ってました。でも、調べてみると、SQLiteをC#で書き直したという素晴らしいものがあるということに先日気づきました。&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;参考にしたサイト&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="http://d.hatena.ne.jp/gsf_zero1/20070713/p1" href="http://d.hatena.ne.jp/gsf_zero1/20070713/p1"&gt;http://d.hatena.ne.jp/gsf_zero1/20070713/p1&lt;/a&gt;&lt;br&gt;C#で書き直したものという情報  &lt;li&gt;&lt;a title="http://sealdb.ddo.jp/develop/sqlite/index.htm" href="http://sealdb.ddo.jp/develop/sqlite/index.htm"&gt;http://sealdb.ddo.jp/develop/sqlite/index.htm&lt;/a&gt;&lt;br&gt;とても詳しいインストール方法とか  &lt;li&gt;&lt;a title="http://mitc.xrea.jp/diary/046" href="http://mitc.xrea.jp/diary/046"&gt;http://mitc.xrea.jp/diary/046&lt;/a&gt;&lt;br&gt;自分の環境に一番近いものにたいする情報かも  &lt;li&gt;&lt;a title="http://download.microsoft.com/download/7/1/3/7138629A-8630-4027-ADE2-819462B6FC70/0406_Kokubun_OST.pdf" href="http://download.microsoft.com/download/7/1/3/7138629A-8630-4027-ADE2-819462B6FC70/0406_Kokubun_OST.pdf"&gt;http://download.microsoft.com/download/7/1/3/7138629A-8630-4027-ADE2-819462B6FC70/0406_Kokubun_OST.pdf&lt;/a&gt;&lt;br&gt;Entity Frameworkもサポートしてる・・・！ &lt;li&gt;&lt;a title="http://blogs.wankuma.com/hatsune/archive/2008/10/16/158915.aspx" href="http://blogs.wankuma.com/hatsune/archive/2008/10/16/158915.aspx"&gt;http://blogs.wankuma.com/hatsune/archive/2008/10/16/158915.aspx&lt;/a&gt;&lt;br&gt;Windows Formアプリケーションの実例&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt; &lt;p&gt;ということで、上記サイトに一通り目を通したので、本家を見ながらやってみようと思います。&lt;/p&gt; &lt;h1&gt;ダウンロード～インストール&lt;/h1&gt; &lt;p&gt;以下のサイトから、最新のSQLite for ADO.NET 2.0をダウンロードします。&lt;/p&gt; &lt;p&gt;本家サイト&lt;br&gt;&lt;a title="http://sqlite.phxsoftware.com/" href="http://sqlite.phxsoftware.com/"&gt;http://sqlite.phxsoftware.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;色々あったのですが、ここではSQLite-1.0.61.0-binaries.zipをダウンロードしました。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb.png" width="244" height="89"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;展開すると、２つのフォルダと１つのhtmファイルが出来ます&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_3.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_3.png" width="244" height="47"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;bin/Designer/install.exeをダブルクリックすると、以下のような画面が表示されるので、チェックをつけてCloseを押します。（さくっと終わるので、本当にインストールされているのか不安になりますが出来てます）&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_4.png" width="244" height="216"&gt;&lt;/a&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Express Editionを使ってる人は注意！！&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;Express Editionを使ってる人には、以下の制約があります。（因みに私の環境はVS2008 std SP1です)&lt;br&gt;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. &lt;/p&gt; &lt;p&gt;Excite翻訳様に聞いた感じだと、Express Editionの場合はAccessのデザイナーをSQLiteのデザイナーに置き換えてしまうことで、Express Editionでも使えるようにしたらしいです。チェックを外すとAccessのデザイナーに戻すことが出来ます。&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h1&gt;コンソールアプリケーションでお試し&lt;/h1&gt; &lt;p&gt;デザイン時のサポートをインストールしたら「SQLiteSample」という名前でコンソールアプリケーションを作ります。&lt;/p&gt; &lt;p&gt;参照の追加から、System.Data.SQLiteを追加します。(下にSystem.Data.SQLite.Linqという気になるものがあるけどここでは追加しないです）&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_5.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_5.png" width="534" height="76"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;そして、コネクションを開いて閉じるだけの小さなサンプルを作ります。&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:751db5a5-e8f5-471a-a655-5a107512ea30" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;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();
            }
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;System.Data.SQLiteの接続文字列は、「Data Source=DBファイル名」というとてもシンプル設計になっています。&lt;br&gt;これを実行して、プロジェクトの下のbin/Debugを見てみると、Test.dbというファイルが作成されます。これがSQLiteのファイルになります。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_6.png" width="244" height="57"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;テーブルを作ろう&lt;/h2&gt;
&lt;p&gt;SQLiteのコネクションを開いて閉じるだけで、勝手にDBファイルが作られることが確認できました。世間のサンプルを見渡してると、そこからCREATE TABLEとかをしてINSERT, SELECT, UPDATE, DELETEをしているものをよく見かけます。&lt;/p&gt;
&lt;p&gt;なので、ここでは、SQLiteのデザイン時サポート機能を使ってテーブルを作っていきます！！&lt;/p&gt;
&lt;p&gt;サーバーエクスプローラから接続の追加を選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_7.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_7.png" width="244" height="94"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; SQLite Database Fileを選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_8.png" width="244" height="147"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;新しくDBを作成したいのでNewボタンを押します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_9.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_9.png" width="244" height="195"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;プロジェクト直下に「Test.db」を作成するようにします。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_10.png" width="244" height="78"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;テスト接続に成功したら、OKを押して完了します。そうすると、サーバーエクスプローラにSQLite[Test]というものが追加されます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_11.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_11.png" width="215" height="161"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;この状態だと、プロジェクトにTest.dbファイルは追加されていないので、上記手順で新規に作成したTest.dbファイルを既存の項目を追加から、プロジェクトに追加します。&lt;br&gt;追加したら、出力ディレクトリにコピーの部分を「新しい場合はコピーする」に変更します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_12.png" width="244" height="153"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;次にテーブルを作っていきます。サーバーエクスプローラに戻ってTablesの所で右クリックをして、新しいテーブルの追加を選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_13.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_13.png" width="244" height="69"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;まだ、開発中の機能だからバグがあったら教えてね！というメッセージが表示されるのでOKを押します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_14.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_14.png" width="244" height="109"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; SQL Serverのテーブルを作成するのと、同じ感じのUIなので戸惑うことなく使えます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_15.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_15.png" width="244" height="142"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Personという名前で、列はID: integer(primary key), Name: nvarchar(50), Age: integerの３つを持ったテーブルを作成します。&lt;/p&gt;
&lt;p&gt;Tablesの下にPersonテーブルが追加されるので、右クリックメニューから「データの取得」を選択します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_16.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_16.png" width="244" height="123"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; テーブルのデータが表示されます。下のようにデータを打ち込むこともできます。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_17.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_17.png" width="244" height="109"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;プログラムから読もう&lt;/h2&gt;
&lt;p&gt;テーブルも出来たので、データを読み込んでみようと思います。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;プロジェクトにTestDataSetという名前でDataSetを追加します。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_18.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_18.png" width="244" height="54"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;DataSetのデザイナにサーバーエクスプローラのPersonテーブルをドラッグアンドドロップします。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_19.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_19.png" width="244" height="158"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SQL Serverの時と同じようにTableAdapterが出来ます！&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_20.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_20.png" width="208" height="158"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Mainに、さっきかいた接続するだけのプログラムをさくっと消してTableAdapterを使ってデータをとってくるコードを書きます。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1016319b-be96-4e1b-8feb-60f19ca59e79" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;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);
            }
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;実行すると、先ほどデザイナを使ってテーブルに入れたデータが取れているのがわかります。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_21.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_21.png" width="244" height="79"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;更新も出来るか確認してみます。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e56747de-9072-46de-b7de-e6a76562b31a" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;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);
            }
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ばっちり更新できています。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_22.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_22.png" width="169" height="163"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;追加もしてみます。さっきのプログラムに続けて以下のコードを追加します。&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b2f208dc-2d2a-4062-9a79-c8e9975552ce" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;// 五郎さんを追加して
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);
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;実行すると、五郎さんが追加されているのがわかります。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_23.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_23.png" width="180" height="108"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Insertのコードは2回実行すると失敗するのでコメントアウトして、次にDeleteの処理を書いて見ます。&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:15896f0a-f85b-47e9-911b-a7bd64ee92f0" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;// 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);
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;実行すると、ばっちり3番目の人が消えてることがわかります。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_24.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://kazuki.wankuma.com/images/2009/CSQLiteSQLite_8364/image_thumb_24.png" width="174" height="74"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h1&gt;まとめ&lt;/h1&gt;
&lt;p&gt;これはなかなかいいものだ！！&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/175189.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>