ローカルデータベースの利用と郵便番号検索

2011年10月7日(金)
PROJECT KySS

ソリューションエクスプローラー内のMainPage.xamlを展開し、MainPage.xaml.vbをダブルクリックして、リスト2のコードを記述します。

ロジックコードを記述する

リスト2 (MainPage.xaml.vb)

Option Strict On

LINQ to SQLを利用するためSystem.Data.Linq名前空間をインポートしておきます。
Imports System.Data.Linq

System.Data.Linq.Mapping名前空間には、System.Data.Linq.Mappingを生成するために使用されるクラスが含まれています。クラス内において、ColumnAttributeや、TableAttributeクラスを、データテーブルに関連付けます。
Imports System.Data.Linq.Mapping

Partial Public Class MainPage
  Inherits PhoneApplicationPage
  ' Constructor
  Public Sub New()
    InitializeComponent()
  End Sub

namaeIDと_namaeのあるNamaeというテーブルを持つ、YourNameというデータベースを定義します。データベースにはDataContextを継承し、各Tableを持つプロパティを定義します。DataContextとは、オブジェクトのバインディング指定情報を、オブジェクトツリーの親から継承できるようにすることです。数値型のnamaeIDプロパティには、Column属性を持たせ、IsPrimaryKeyにTrueを指定し、主キーを設定します。IsDbGeneratedにTrueを指定し自動連番を有効にします。
文字列型の_namaeプロパティには、Column属性を持たせ、CanBeNullにFalseを指定して、Nullを非許可としています。
接続文字列は基底クラスに渡す形で、保存場所はIsolatedStorage内です。「isostore:/yourNameDB.sdf」と指定します。yourNameDBの部分は、どのような名前でも可能ですが、拡張子は必ず.sdfです。またisostore:/は固定です。
  Public Class YourName
    Inherits DataContext
    Public Namae As Table(Of Namae)
    Public Sub New()
      MyBase.New("isostore:/yourNameDB.sdf")
    End Sub
  End Class
  <Table()>
  Public Class Namae
    <Column(IsPrimaryKey:=True, IsDbGenerated:=True)>
    Public Property namaeID As Integer
 
    <Column(CanBeNull:=False)>
    Public Property _namae As String
  End Class

namaeIDと_namaeのあるNamaeというテーブルを持つ、新しいYourNameというデータベースのインスタンスdbを作成します
  Dim db As YourName = New YourName()

「氏名」を入力するTextBoxがフォーカスを持った時の処理

TextBoxの中を空にします。「氏名を入力」の文字が消え、新しいデータの入力が可能になります。
  Private Sub namaeTextBox_GotFocus(sender As Object, e As System.Windows.RoutedEventArgs) Handles namaeTextBox.GotFocus
    namaeTextBox.Text = String.Empty
  End Sub

[追加]ボタンがクリックされた時の処理

「氏名」が未入力の場合は警告メッセージを表示します。
Namaeクラスの新しいリストであるnameListを作成します。同じく、Namaeクラスの新しいリストであるreNameListを作成します。DatabaseExistsメソッドで関連するデータベースを開くことができるかどうか判別し、開けない場合は、CreateDatabaseメソッドでデータベースを作成します。新しいNamaeクラスの_namaeプロパティにnamaeTextBoxに入力された値を指定し、AddメソッドでnameListオブジェクトに追加します。InsertAllOnSubmitメソッドで、DataContext (Namaeクラス)にコレクションのすべてのエンティティ(nameListオブジェクト)を追加します。SubmitChangesメソッドでデータベースを変更します。このメソッドが実行されるまでデータベースは変更されません。
次に、Namaeクラスのコレクション内を変数resultで反復処理しながら、新しいNamaeクラスのnamaeIDプロパティにNamaeクラスのコレクション内のnamaeIDの値を、_namaeプロパティに_namaeの値を指定し、reNameListオブジェクトにAddメソッドで追加します。ListBoxのItemsSourceにreNameListオブジェクトを指定します。これで、ListBox内に連番と氏名と「ごみ箱」アイコンが表示されます。
  Private Sub addButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles addButton.Click
    If namaeTextBox.Text = String.Empty Then
      MessageBox.Show("データを入力してください")
      Exit Sub
    Else
      Dim nameList As New List(Of Namae)
      Dim reNameList As New List(Of Namae)
 
      If db.DatabaseExists = False Then db.CreateDatabase()
      nameList.Add(New Namae With {._namae = namaeTextBox.Text})
      db.Namae.InsertAllOnSubmit(nameList) 
      db.SubmitChanges()
 
      For Each result In From c In db.Namae Select c
        reNameList.Add(New Namae With {.namaeID = result.namaeID, ._namae = result._namae})
      Next
      ListBox1.ItemsSource = reNameList
    End If
  End Sub

「ごみ箱」アイコンがクリックされた時の処理

Button(DeleteButton)のTagプロパティにバインドしておいたnamaeIDを取得して、変数delDataに格納します。Namaeクラスの、namaeIDプロパティの値が、delDataの値と同じNamaeクラスのコレクション内を、変数resultで反復処理しながら、DeleteOnSubmitメソッドで、namaeIDが同じデータをNamaeクラスのコレクションから削除します。SubmitChangesメソッドで削除されたデータベースを変更します。
ListBoxのItemsSourceプロパティにdb.Namae.ToListを指定します。これで、ListBox内で選択したデータが削除されます。db.Namaeと指定しただけでは、うまく動作しません。ToListメソッドで明示的にリストに変換する必要があります。
  Private Sub DeleteButton_Click(sender As Object, e As EventArgs)
    Dim delData As String= DirectCast(sender, Button).Tag.ToString
      For Each result In From c In db.Namae Where c.namaeID.Equals(Integer.Parse(delData)) Select c
        db.Namae.DeleteOnSubmit(result)
      Next
      db.SubmitChanges()
      ListBox1.ItemsSource = db.Namae.ToList
  End SubEnd Class

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています