【第56号】
第56号(2007.8.21発行) ====================================================================== ★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★ (VB 2005 Express & SQL Server 2005 Express) ---------------------------------------------------------------------- いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中 心に掲載します。今後ともよろしくお願い申し上げます。 すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/ ====================================================================== ■■ Usingステートメント使ってDBを開く ■■ VB.NETでは、コネクションのOpenメソッドを呼出したら、Try-Finallyステー トメントを使って、FinallyブロックでCloseメソッドを呼出すようにコーディ ングしていました。 しかし、VB 2005から新たに使えるようになった Usingステートメントを使うと、 Closeメソッドを呼出さなくても、End Usingを抜ける時に自動的に接続を閉じ ることができます。したがって、Finallyブロックで、closeメソッドを明示的 に呼出す必要はありません。 Usingステートメントを使うと、プログラムが短くなるばかりか、確実にオブ ジェクトを廃棄でき、バグの出にくいプログラムを作成できます。 Usingステートメントを使って、前号のサンプルプログラムを修正しました。 Try Using con As New SqlConnection Dim settings As ConnectionStringSettings '接続文字列をapp.configファイルから取得 settings = _ ConfigurationManager.ConnectionStrings _ ("AdoNet.My.MySettings.sampleDBConStr") If settings Is Nothing Then '接続文字列取得エラー MessageBox.Show("app.configに未登録", "接続文字列エラー") Else '接続文字列の設定 con.ConnectionString = settings.ConnectionString 'DBを開く con.Open() End If End Using Catch ex As Exception '例外が発生した時の処理 MessageBox.Show(ex.ToString, "例外発生") '***** Closeメソッドの呼び出しは不要 ***** 'Finally ' 'DBを閉じる ' If Not con.State = ConnectionState.Closed Then ' con.Close() ' End If End Try 以降この方式で、コーディングしていくことにします。 ---------------------------------------------------------------------- ■■ 社員テーブルを検索する ■■ 検索ボタンをクリックすると、入力した社員コードのエラーチェックをして、 エラーが無ければ、社員テーブルから該当レコードを取得し、社員氏名と社員 カナを表示します。 【社員テーブル】 --------------------------------------------- key 列 名 データ型 nullを許容 --------------------------------------------- ○ 社員コード nchar(5) 許容しない − 社員氏名 nvarchar(20) 許容しない − 社員カナ nvarchar(40) 許容しない − 部署コード nchar(4) 許容しない − 更新日時 datetime 許容しない --------------------------------------------- ◆プロジェクトをひとつ作成して、フォームに下記のコントロールを貼り付 けて、プロパティを図のように設定します。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 社員テーブル検索 _□×┃ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ Label1 TxtShainCode BtnKensaku ┃┌―――――┐ ┌―――――┐ ┌――――┐ ┃│社員コード│ │ │ │ 検索 │ ┃└―――――┘ └―――――┘ └――――┘ ┃ Label2 LblShainShimei ┃┌―――――┐ ┌――――――――┐ ┃│社員氏名 │ │ │ ┃└―――――┘ └――――――――┘ ┃ Label3 LblShainKana ┃┌―――――┐ ┌――――――――┐ ┃│社員カナ │ │ │ ┃└―――――┘ └――――――――┘ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 社員コードは、英数字と_と-で構成されている前提で、エラーチェックしてい ます。 接続文字列は、app.configに、次のようにあらかじめ登録しておきます。見や すいように適時折り返しています。 <connectionStrings> <add name="AdoNet.My.MySettings.sampleDBConStr" connectionString="Data Source=.¥SQLEXPRESS; AttachDbFilename=|DataDirectory|¥sample.mdf; Integrated Security=True; Connect Timeout=30; User Instance=True" providerName="System.Data.SqlClient" /> </connectionStrings> SQL Serverの場合は、Imports System.Data.SqlClient をImportsします。 SqlParameter で使用するデータ型は、SqlDbType 列挙体として定義されてい ます。cmd.Parameters.Add("@KeyValue", SqlDbType.NChar, 5)のデータ型に 注意すれば、OleDbとまったく同様のコーディングになります。 さっそく、Usingステートメントを使いました。Usingで生成したconは、 End Usingを抜ける時に、自動的に解放されます。 Using con As New SqlConnection .............. .............. End Using Fillメソッドを使うと、FillメソッドがOpenメソッドとCloseメソッドを自動 的に呼出します。したがって、明示的に、Openメソッドを呼び出す必要はあり ませんが、たとえOpenメソッドを呼出したとしても、Usingステートメントを 使っているので、Closeメソッドは呼出しません。 --【プログラムソースリスト】------------------------------------------ Imports System.Data.SqlClient Imports System.Configuration '参照の追加でSystem.Configurationを追加 Imports System.Text.RegularExpressions Public Class Form056 '====================<< 検索ボタン押下時 >>==================== Private Sub BtnKensaku_Click _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnKensaku.Click Dim dt As New DataTable() 'リターン値 Try Using con As New SqlConnection Dim cmd As New SqlCommand '----------< 接続関連プロパティ設定 >---------- '変数の宣言 Dim settings As ConnectionStringSettings '接続文字列をapp.configファイルから取得 settings = _ ConfigurationManager.ConnectionStrings _ ("AdoNet.My.MySettings.sampleDBConStr") If settings Is Nothing Then '接続文字列取得エラー Throw New Exception _ ("接続文字列がapp.configに未登録.") End If '接続文字列の設定 con.ConnectionString = settings.ConnectionString 'SqlCommand.Connectionプロパティの設定 cmd.Connection = con 'SQL文設定 cmd.CommandText = "SELECT * FROM 社員テーブル" & _ " WHERE 社員コード = @KeyValue" 'SQL文の引数設定 cmd.Parameters.Clear() cmd.Parameters.Add("@KeyValue", SqlDbType.NChar, 5) '----------< コマンド引数に値を設定 >---------- '前後の空白は除去する Me.TxtShainCode.Text = Me.TxtShainCode.Text.Trim() '入力値のチェック(注:キー値は英数字と_と-で構成されている) If Not Regex.IsMatch(Me.TxtShainCode.Text, "^[0-9a-zA-Z_¥-]+$") Then '英数字_-以外はエラー Me.LblShainShimei.Text = Nothing Me.LblShainKana.Text = Nothing MessageBox.Show _ ("入力した社員コードに誤りがあります", "入力エラー") Else '入力値が正常 cmd.Parameters("@KeyValue").Value = Me.TxtShainCode.Text '----------< テーブルからレコード取得 >---------- Dim da As New SqlDataAdapter da.SelectCommand = cmd da.Fill(dt) If dt.Rows.Count = 1 Then 'レコードがあった時 Me.LblShainShimei.Text = CStr(dt.Rows(0)("社員氏名")) Me.LblShainKana.Text = CStr(dt.Rows(0)("社員カナ")) Else 'レコードが無い時 Me.LblShainShimei.Text = Nothing Me.LblShainKana.Text = Nothing MessageBox.Show _ ("入力した社員コードのデータがありません", "入力エラー") End If End If End Using Catch ex As Exception MessageBox.Show(ex.ToString, "例外発生") End Try End Sub End Class ---------------------------------------------------------------------- 次号では、引数に指定したテーブル名と主キー値からレコードを取得する GetKeyDataメソッドを、クラスメソッドとして実装します。 ====================================================================== VB.NET データベースプログラミング奮闘記 発行者:ウェブ実験室 http://park5.wakwak.com/‾weblab/ ---------------------------------------------------------------------- このメールマガジン(マガジンID: 0000128094)は、 インターネットの本屋さん『まぐまぐ』から配信されています。 http://www.mag2.com/ 【購読中止の方法】購読の中止は次のホームページからお願い致します。 http://park5.wakwak.com/‾weblab/ http://www.mag2.com/m/0000128094.htm ---------------------------------------------------------------------- このメールマガジン及び「すぐ使えるADO.NET」ホームページで公開している ソースプログラム・データの利用により生じた損害等については、発行者は 一切責任を負いません。ソースプログラムの再利用は自由です。著作権は発行 者が所有します。 このメールマガジン及び「すぐ使えるADO.NET」ホームページに掲載されてい る会社名・製品名等は、各社の登録商標または商標です。 ======================================================================
↑このページ(メルマガ:VB.NETデータベース) 先頭へ | すぐ使えるADO.NET ホームへ
Copyright© すぐ使えるADO.NET. All rights reserved.