バックナンバー:VB.NETデータベースプログラミング
ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。
【第69号】
第69号(2009.2.5発行)
====================================================================
★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★
(VB 2008 Express & SQL Server 2005 Express)
--------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを
中心に掲載します。今後ともよろしくお願い申し上げます。
すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
====================================================================
■■ マスターテーブル保守改良版 テーブル検索 ■■
マスター保守のプログラムは完成しましたが、現在見直し中です。今回は、
見直しが終わったマスターテーブル検索【修正版】の、ソースリストを掲載
します。他も順次掲載していきます。
主な修正点は、フォームクラスでの開発負担を軽減するために、フォームク
ラスから、テーブルアクセスクラスのメンバーを呼び出さないで済むように
した点です。
お手数ですが、下記のソースリストと置き換えをお願いします。
--------------------------------------------------------------------
■■ 社員テーブルを検索する ■■
検索ボタンをクリックすると、入力した社員コードのエラーチェックをして、
エラーが無ければ、社員テーブルから該当レコードを取得し、社員氏名と社
員カナを表示します。
【社員テーブル】
---------------------------------------------
key 列 名 データ型 nullを許容
---------------------------------------------
○ 社員コード nchar(5) 許容しない
− 社員氏名 nvarchar(20) 許容しない
− 社員カナ nvarchar(40) 許容しない
− 更新日時 datetime 許容しない
---------------------------------------------
◆新規にプロジェクトを作成して、フォームに下記のコントロールを貼り付
けてください。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル検索 _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Label1 TxtShainCode BtnRetrieval
┃┌―――――┐ ┌―――――┐ ┌――――┐
┃│社員コード│ │ │ │ 検索 │
┃└―――――┘ └―――――┘ └――――┘
┃ Label2 LblShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │ │
┃└―――――┘ └――――――――┘
┃ Label3 LblShainKana
┃┌―――――┐ ┌――――――――┐
┃│社員カナ │ │ │
┃└―――――┘ └――――――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
接続文字列は、app.configに登録しておきます。
<connectionStrings>
<add name="AdoNet.My.MySettings.sampleDBConStr" .......... />
</connectionStrings>
====================================================================
【画面クラスの主な改良修正点】
画面クラスからは、社員テーブルアクセスクラスのメンバーを呼び出さない
ように修正しました。
--【プログラムソースリスト(FormSelect.vb)】-----------------------
'////////// 社員テーブル検索画面クラス //////////
Public Class FormSelect
Private shain As ClsSelectShain
'----------<< 検索ボタン押下処理 >>----------
Private Sub BtnRetrieval_Click _
(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles BtnRetrieval.Click
Try
' 社員データ選択クラスのインスタンス生成
Me.shain = New ClsSelectShain(Me.TxtShainCode.Text)
Me.LblShainShimei.Text = Me.shain.ShainShimei
Me.LblShainKana.Text = Me.shain.ShainKana
Catch ex As myShainCodeException
' 社員コードエラー
Me.LblShainShimei.Text = Nothing
Me.LblShainKana.Text = Nothing
MessageBox.Show(ex.Message, "入力エラー")
Me.TxtShainCode.Focus()
Catch ex As myDBIOException
' DBIO独自例外発生時
MessageBox.Show(ex.Message, "DBIO例外発生")
Catch ex As Exception
' その他例外発生時
MessageBox.Show(ex.ToString, "例外発生")
End Try
End Sub
End Class
====================================================================
【社員データ基本クラスの主な改良修正点】
外部から値をセットする必要のない更新日時プロパティをReadOnlyにして、
Setプロパティを削除しました。
サブクラスでのアクセス方法が異なるため、社員コードプロパティ宣言は削
除して、各サブクラスで実装することにしました。
--【プログラムソースリスト(ClsShain.vb)】-------------------------
Option Strict On
Imports System.Text.RegularExpressions
'////////// 基本クラス:社員データクラス //////////
Public MustInherit Class ClsShainBase
'----------<< メンバ:変数 >>----------
Protected shainCodeValue As String
Private shainShimeiValue As String
Private shainKanaValue As String
Protected koushinNichijiValue As DateTime
'--------------------------------------------------------
' 機能:コンストラクタ
' 引数:なし
'----1---------2---------3---------4---------5----------6
Protected Sub New()
MyBase.New() ' 基本クラスのコンストラクタを呼び出す
End Sub
'--------------------------------------------------------
' プロパティ:社員氏名
'--------------------------------------------------------
Public Property ShainShimei() As String
' Getプロパティ
Get
Return shainShimeiValue
End Get
' Setプロパティ
Set(ByVal value As String)
' 【エラーチェック】
If value.Length = 0 Then
' 未入力はエラー
Throw New myShainShimeiException _
("社員氏名を入力してください")
Else
shainShimeiValue = value
End If
End Set
End Property
'--------------------------------------------------------
' プロパティ:社員カナ
'--------------------------------------------------------
Public Property ShainKana() As String
' Getプロパティ
Get
Return shainKanaValue
End Get
' Setプロパティ
Set(ByVal value As String)
' 【エラーチェック】
If value.Length = 0 Then
' 未入力はエラー
Throw New myShainKanaException _
("社員カナを入力してください")
Else
' 全角カタカナ以外はエラー
If Regex.IsMatch(Value, "^[ァ-ー]+$") Then
shainKanaValue = value
Else
Throw New myShainKanaException _
("全角カタカナのみで入力してください")
End If
End If
End Set
End Property
'--------------------------------------------------------
' プロパティ:更新日時
'--------------------------------------------------------
Public ReadOnly Property KoushinNichiji() As DateTime
' Getプロパティ
Get
Return koushinNichijiValue
End Get
End Property
End Class
====================================================================
【社員データ選択更新削除クラスの主な改良修正点】
コンストラクタの引数に社員コードを指定して、社員テーブルアクセスクラ
スのメソッドを呼び出すように修正しました。また社員コードプロパティを、
ReadOnlyに変更しました。
--【プログラムソースリスト(ClsShain.vb)】-------------------------
'//////// サブ抽象クラス:社員データ選択更新削除クラス ////////
Public MustInherit Class ClsShainSub
Inherits ClsShainBase
'=======================================================
' 機能:コンストラクタ
' 引数:社員コード
'=======================================================
Protected Sub New(ByVal shainCode As String)
MyBase.New() ' 基本クラスのコンストラクタを呼び出す
' ---<< 社員テーブルからレコード取得 >>---
Dim shainTable As New ClsShainTableIO
Dim dt As DataTable
' レコード取得メソッド呼出
dt = shainTable.GetKeyData(shainCode)
If dt.Rows.Count = 1 Then
' レコードがあった時
MyBase.ShainShimei = CStr(dt.Rows(0)("社員氏名"))
MyBase.ShainKana = CStr(dt.Rows(0)("社員カナ"))
MyBase.KoushinNichijiValue = _
CDate(dt.Rows(0)("更新日時"))
Else
' レコードが無かった時
Throw New myShainCodeException _
("社員テーブルにレコードがありません")
End If
End Sub
'--------------------------------------------------------
' プロパティ:社員コード
'--------------------------------------------------------
Public ReadOnly Property ShainCode() As String
' Getプロパティ
Get
Return shainCodeValue
End Get
End Property
End Class
====================================================================
【社員データ選択クラスの主な改良修正点】
社員データ選択更新削除クラスで、コンストラクタの引数に社員コードを指
定するように変更したため、社員データ選択クラスのコンストラクタも、引
数に社員コードを指定します。
--【プログラムソースリスト(ClsShain.vb)】-------------------------
'////////// 派生クラス:社員データ選択クラス //////////
Public Class ClsSelectShain
Inherits ClsShainSub
'==========================================================
' 機能:コンストラクタ
' 引数:社員コード
'==========================================================
Public Sub New(ByVal shainCode As String)
MyBase.New(shainCode)
End Sub
End Class
====================================================================
【sampleDBアクセスクラスの改良修正点】
Try … Catch … End Try をはずして、エラー発生時はそのまま例外をス
ローするように修正しました。
--【プログラムソースリスト(ClsSampleDBIO.vb)】--------------------
Option Strict On
Imports System.Data.SqlClient
Imports System.Configuration '[参照の追加]から追加
'////////// 基本クラス:sampleDBアクセスクラス //////////
Public MustInherit Class ClsSampleDBIO
'==========================================================
' 機能:コンストラクタ
' 引数:なし
'==========================================================
Public Sub New()
MyBase.New()
End Sub
'**********************************************************
' 機能:引数に指定したテーブルのキー値のレコードを取得する
' 引数:テーブル名
' 引数:キーフィールド名
' 引数:主キー値
' 戻値:取得したレコード
' 補足:テーブル名の主キーフィールドはNChar型とする
'******1*********2*********3*********4*********5**********6
Public Function GetKeyData(ByVal tableName As String, _
ByVal keyField As String, _
ByVal keyValue As String) _
As DataTable
Dim retDt As New DataTable 'リターン値
'---<< テーブルからレコード取得 >>---
Using con As New SqlConnection
Using cmd As New SqlCommand
' 接続関連プロパティ設定
Me.SetConnection(con, cmd)
' SQL文設定
cmd.CommandText = _
"SELECT * FROM " & tableName & _
" WHERE " & keyField & " = @keyValue"
' SQL文の引数設定
cmd.Parameters.Clear()
' パラメータの実際のサイズからデータ長を推論
cmd.Parameters.Add("@keyValue", SqlDbType.NChar)
' コマンド引数に値を設定
cmd.Parameters("@keyValue").Value = keyValue
' レコード取得
Dim da As New SqlDataAdapter
da.SelectCommand = cmd
da.Fill(retDt)
End Using
End Using
' ◆戻値を設定してリターン
Return retDt
End Function
'**********************************************************
' 機能:接続関連プロパティ設定
' 引数:参照 SqlConnectionオブジェクト
' 引数:参照 SqlCommandオブジェクト
' 戻値:なし
'******1*********2*********3*********4*********5**********6
Public Sub SetConnection(ByRef con As SqlConnection, _
ByRef cmd As SqlCommand)
Dim settings As ConnectionStringSettings
' 接続文字列をapp.configファイルから取得
settings = _
ConfigurationManager.ConnectionStrings _
("AdoNet.My.MySettings.sampleDBConnectionString")
If settings Is Nothing Then
' 接続文字列取得エラー
Throw New Exception("app.configに未登録")
Else
' 接続文字列の設定
con.ConnectionString = settings.ConnectionString
' SqlCommand.Connectionプロパティの設定
cmd.Connection = con
End If
End Sub
End Class
====================================================================
【社員テーブルアクセスクラスの改良修正点】
このクラスも、Try … Catch … End Try をはずして、エラー発生時はそ
のまま例外をスローするように修正しました。
--【プログラムソースリスト(ClsShainTableIO.vb)】------------------
Option Strict On
Imports System.Text.RegularExpressions
'////////// 派生クラス:社員テーブルアクセスクラス //////////
Public Class ClsShainTableIO
Inherits ClsSampleDBIO
'=========================================================
' 機能:コンストラクタ
' 引数:なし
'=========================================================
Public Sub New()
MyBase.New()
End Sub
'**********************************************************
' 機能:引数のレコードを社員テーブルから取得する
' 引数:社員コード
' 戻値:取得したレコード
'******1*********2*********3*********4*********5**********6
Public Overloads _
Function GetKeyData(ByVal shainCode As String) As DataTable
Dim retDt As New DataTable ' リターン値
' 引数Nothing(未設定)・空白チェック
If shainCode.Length = 0 Then
Throw New myShainCodeException _
("エラー:社員コードが未入力")
End If
' 引数の前後の空白は除去する
shainCode = shainCode.Trim()
' キー値文字チェック(キー値は英数字のみで構成されている)
If Not Regex.IsMatch(shainCode, "^[0-9a-zA-Z]+$") Then
' 英数字以外はエラー
Throw New myShainCodeException _
("エラー:社員コードに不正な文字あり")
End If
' キー値長さチェック(社員コードは5桁)
If Not shainCode.Length = 5 Then
' 5桁以外はエラー
Throw New myShainCodeException _
("エラー:社員コードの桁数が正しくない")
End If
' 社員テーブルから引数コードのレコードを取得する
retDt = _
MyBase.GetKeyData("社員テーブル", "社員コード", shainCode)
' ◆戻値を設定してリターン
Return retDt
End Function
End Class
--------------------------------------------------------------------
次号は、マスター保守(社員テーブル追加)の修正版です。
====================================================================
VB.NET データベースプログラミング奮闘記
発行者:ウェブ実験室([email protected])
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」「やさしいBV2008 ADO.NET」
などのホームページで公開しているソースプログラム・データの利用により
生じた損害等については、発行者は一切責任を負いません。ソースプログラ
ムの再利用は自由です。著作権は発行者が所有します。
このメールマガジン及び「すぐ使えるADO.NET」「やさしいBV2008 ADO.NET」
などホームページに掲載されている会社名・製品名等は、各社の登録商標ま
たは商標です。
====================================================================
▲このページ先頭へ | すぐ使えるADO.NET ホームへ
Copyright© すぐ使えるADO.NET. All rights reserved.