読者です 読者をやめる 読者になる 読者になる

この世には、DB関連の技術が...多すぎるっ!

DB

ちょっとしたデータベースを使うプログラムを組もうと思い調査してみた。

しかし、Microsoft関連に限ったとしても、最近はASP.NET Dynamic DataやADO.NET Entity Frameworkというフレームワークが出てきているし、どんなクラスを使うのか調べてみても、DataAdapter、TableAdapter、DataContextとか色々出てくる。正直、よく分からない。

それぞれの技術のメリット・デメリットとか、この技術は古いからこっちの使った方がいいよとか、誰かがまとめてくれてたりしないかなぁ。

ま、今回はお手軽に試したいので、「SQL Server Compact 3.5」と「LINQ to SQLクラス」を使ってみる。

だーしゃああぁぁーー!!

データベースの作成

  • Visual Studio 2008の表示メニューから、サーバーエクスプローラを表示させる。
  • サーバーエクスプローラの「データ接続」を右クリックして「接続の追加」を選択する。
  • データソースに「Microsoft SQL Server Compact 3.5」を選択する。
  • 接続のプロパティのデータベースに、適当なデータベースファイルを指定する。(拡張子.sdf)
  • テーブルを右クリックして「テーブルの作成」を選択。適当にデータ構造を作成する。

LINQ to SQLクラスの作成

  • Visual Studio 2008で、新規プロジェクトを作る。
  • プロジェクトに「LINQ to SQLクラス」を追加して、サーバーエクスプローラからデザイナにドラッグアンドドロップすると、「選択されたオブジェクトにはサポート外のデータプロバイダが使用されています。」というエラーが出る。どうやら問題があってこの方法はできないらしい。
  • そこで、「LINQ to SQLクラス」は追加せずに、を参考にして、コマンドプロンプトから変換処理をおこなう。
  • 生成されたdbmlファイルをプロジェクトに追加する。
  • するとデザイナが使えるので、リレーションを設定したい場合は、ツールボックスバーから「関連付け」を利用する。

データベースへのアクセス

  • dbmlファイルの配下に、データにアクセスするためのDataContextを継承したクラスができているので、それを使ってデータの更新や参照をおこなうことができる。
  • データの挿入はこんな感じ。
using (var tw = new TwitterDatabase(@"C:\db\TwitterDatabase.sdf"))
{
    Status status = new Status()
    {
        Created_at = "2008/9/19 22:38:09",
        Favorited = false,
        Id = "1234",
        In_reply_to_status_id = "",
        In_reply_to_user_id = "",
        Source = "Web",
        Text = "こんにちは",
        Truncated = false,
        User_id = "15805104"
    };
    tw.Status.InsertOnSubmit(status);

    User usr = new User()
    {
        Description = null,
        Followers_count = 46,
        Id = "15805104",
        Location = "Tokyo",
        Name = "ZOETROPE",
        Profile_image_url = "http://s3.amazonaws.com/twitter_production/profile_images/59540963/seiuchi4.png",
        Protected = false,
        Screen_name = "zoetter",
        Url = "http://d.hatena.ne.jp/ZOETROPE"
    };
    tw.User.InsertOnSubmit(usr);
    tw.SubmitChanges();
}
  • データの参照はこんな感じ。
using (var db = new TwitterDatabase(@"C:\db\TwitterDatabase.sdf"))
{
    var result = from status in db.Status
                 where status.User.FirstOrDefault().Name == "ZOETROPE"
                 select new { id = status.Id, text = status.Text };
    
    Console.WriteLine(result.First().text);
}

StatusとUserの関係が一対多になっているから、FirstOrDefaultを使ってるけど、一対一にするにはどうすればいいんだろう?