【VB.NET】SQLiteに接続してデータを取得してみる
おはようございます。
予告通り。今回はデータベースから取得したデータを表示したいと思います。
プログラムは前回のものを流用します。
【VB.NET】SQLiteのデータベース及びテーブルを動的に作成してみる
スポンサーリンク
データの追加
前回作成したテーブルにデータをツール、もしくはコマンドラインから追加します。
1 2 3 4 5 6 7 8 9 | INSERT INTO MSTKIND VALUES("01","キジトラ"); INSERT INTO MSTKIND VALUES("02","長毛種(不明)"); INSERT INTO MSTKIND VALUES("03","ミケ(っぽい)"); INSERT INTO MSTKIND VALUES("04","サビ"); INSERT INTO MSTKIND VALUES("09","その他"); INSERT INTO TBLCAT VALUES('1','そら','♂','6','01','犬の人形'); INSERT INTO TBLCAT VALUES('2','りく','♂','5','02','人間'); INSERT INTO TBLCAT VALUES('3','うみ','♀','4','03','高級ウェットフード'); INSERT INTO TBLCAT VALUES('4','こうめ','♀','2','04','横取りフード'); |
追加したデータを確認します。
Linq で データを取得、設定する
参照の追加
ソリューション・エクスプローラーからプロジェクトの「参照」を右クリックし、「参照の追加」を選択します。
「System.Data.Linq」で検索、チェックしてOKボタンをクリックします。
プログラム修正
クラスの追加
猫クラス
Cat.vb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ImportsSystem.Data.Linq.Mapping ''' <summary> ''' 猫クラス ''' </summary> <Table(Name:="tblcat")> PublicClassCat <Column(Name:="no",IsPrimaryKey:=True)> PublicProperty No AsInteger <Column(Name:="name")> PublicProperty Name AsString <Column(Name:="sex")> PublicProperty Sex AsString <Column(Name:="age")> PublicProperty Age AsInteger <Column(Name:="kind_cd")> PublicProperty KindCd AsString <Column(Name:="favorite")> PublicProperty Favorite AsString EndClass |
種別クラス
Kind.vb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ImportsSystem.Data.Linq.Mapping ''' <summary> ''' 種別クラス ''' </summary> <Table(Name:="mstkind")> PublicClassKind ''' <summary> ''' 種別コード ''' </summary> ''' <returns></returns> <Column(Name:="kind_cd",IsPrimaryKey:=True)> PublicProperty KindCd AsString ''' <summary> ''' 種別名 ''' </summary> ''' <returns></returns> <Column(Name:="kind_name")> PublicProperty KindName AsString EndClass |
インポート宣言の追加
次の記述を先頭に追加します。
1 | ImportsSystem.Data.Linq |
フォームロード時にコンボボックスにデータを設定する
次の記述をフォームロード時のイベントメソッドに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ' 種別コンボボックスの内容をデータベースから取得して設定 Using con AsNewDataContext(conn) Dimkinds AsTable(Of Kind)=con.GetTable(Of Kind) Dimresult AsIQueryable(Of Kind)=FromxIn kinds Order Byx.KindCd Selectx Dimempty AsNewKind() empty.KindCd="" empty.KindName="指定なし" Dimlist=result.ToList() list.Insert(0,empty) ' コンボボックスに設定 cmbKind.DataSource=list cmbKind.DisplayMember="kindName" EndUsing |
検索ボタンのクリックイベント追加
デザイナー画面にて配置した「検索」ボタンをダブルクリックします。
検索処理の実装
自動生成されたメソッドに次の処理を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | ''' <summary> ''' 検索ボタンクリックイベント. ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubbtnSearch_Click(sender AsObject,eAsEventArgs)HandlesbtnSearch.Click Using conn AsNewSQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' 検索条件を指定してデータを取得 Using con AsNewDataContext(conn) DimsearchName AsString=txtName.Text DimsearchKind AsString=CType(cmbKind.SelectedValue,Kind).KindCd DimtblCat AsTable(Of Cat)=con.GetTable(Of Cat) Dimresult AsIQueryable(Of Cat) If(searchKind="")Then ' 種別が選択されていなければ名前のみ前方一致指定 result=FromxIn tblCat Wherex.Name.StartsWith(searchName) Order Byx.No Selectx Else ' 種別が選択されていれば名前+種別で検索 result=FromxIn tblCat Wherex.Name.StartsWith(searchName)Andx.KindCd=searchKind Order Byx.No Selectx EndIf ' データグリッドビューに設定 dgvCat.DataSource=result.ToList() EndUsing ' データベースクローズ conn.Close() EndUsing EndSub |
起動してみる
起動後の画面。
コンボボックスに無事にデータが設定されました。
検索ボタンをクリックして、データグリッドビューにも無事にデータが表示されました。
まとめ
C#とほぼ同じなので難しくはないですね。
次回はデータの追加・更新・削除なんかもやってみます。
ではでは。
ディスカッション
コメント一覧
すみません、探し方が悪いのか
VB.netでのKindクラスとCatクラスの作り方が見当たらないようなのですが
WPFのファイルが自動変換されて使えるってことなのでしょうか?
匿名希望様
ご指摘ありがとうございます。
漏れてしまっていたようなので追記いたしました。
ご確認よろしくお願いします。
素早い確認と対応、どうもありがとうございました。
コンパイルは通りましたので大丈夫なようです。
プログラムの動きとかそれ以上の確認は明日になりそうです。
取り急ぎ、御礼までに。
動作報告です。
実行も動作し、コンボボックスにて”指定なし”の選択で検索ボタン押下はうまくいきました。
ただ、コンボボックスをキジトラ等に変更して検索を押下すると
———
System.Data.SQLite.SQLiteException: ‘SQL logic error
no such function: NVarChar’
———
というエラーが出てしまうようです。
勉強不足な私では何がどう間違っているかはわかりませんでした。
この先の記事へ進んでいけば動くようになる部分なのかもしれませんので、進めてみます。
どうもありがとうございました。
匿名希望様
すみません、プログラムに一部不備があったようです。
111行目あたりの Linqクエリ式を次のように変更してみてください。
Where x.Name.StartsWith(searchName) & x.KindCd.Equals(searchKind)
↓
Where x.Name.StartsWith(searchName) And x.KindCd.Equals(searchKind)
以上です。
よろしくお願いします。
何度もすみません。
この後の続き記事であろうと思われる
——-
https://www.doraxdora.com/blog/2017/12/24/post-3541/
【VB.NET】SQLiteに接続してデータを登録してみる
——-
の、ページが
>サイトに重大なエラーがありました。
とのことで、表示ができなくなっているようです。
お手数をおかけいたしますが、ご確認頂ければ幸いです。
よろしくお願いいたします。
何度もすみません。
続き記事だと思われる
>【VB.NET】SQLiteに接続してデータを登録してみる
の、ページが
>サイトに重大なエラーがありました。
とのことで、表示ができなくなっているようです。
お手数をお掛けいたしますが、ご確認いただければ幸いです。
よろしくお願いいたします。
匿名希望様
ご指摘ありがとうございます。
記事の方修正しましたのでご確認をお願いします。
よろしくお願いします。