バックナンバー:VB.NETデータベースプログラミング
ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。
【第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.