バックナンバー:VB.NETデータベースプログラミング
ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。
【第72号】
第72号(2009.4.30発行)
====================================================================
★★ -- 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 許容しない
---------------------------------------------
【部署テーブル】
---------------------------------------------
key 列 名 データ型 nullを許容
---------------------------------------------
○ 部署コード nchar(4) 許容しない
− 部署名 nvarchar(20) 許容しない
− 更新日時 datetime 許容しない
---------------------------------------------
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル削除 _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Label1 TxtShainCode BtnRetrieval
┃┌―――――┐ ┌―――――┐ ┌――――┐
┃│社員コード│ │ │ │ 検索 │
┃└―――――┘ └―――――┘ └――――┘
┃ Label2 LblShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │ │
┃└―――――┘ └――――――――┘
┃ Label3 LblShainKana
┃┌―――――┐ ┌――――――――――――――┐
┃│社員カナ │ │ │
┃└―――――┘ └――――――――――――――┘
┃ Label4 LblBushoMei
┃┌―――――┐ ┌――――――┐
┃│部署 │ │ │
┃└―――――┘ └――――――┘
┃ BtnDelete BtnClear
┃┌――――┐ ┌―――――┐
┃│ 削除 │ │ クリア │
┃└――――┘ └―――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛
接続文字列は、app.configに登録しておきます。
<connectionStrings>
<add name="AdoNet.My.MySettings.sampleDBConStr" .......... />
</connectionStrings>
====================================================================
【画面クラスの主な改良修正点】
画面クラスからは、テーブルアクセスクラスのメンバーを呼び出さないよう
に修正しました。
--【プログラムソースリスト(FormDelete.vb)】-----------------------
Option Strict On
'////////// 社員マスター削除画面クラス //////////
Public Class FormDelete
'----------<< フォームロード処理 >>----------
Private Sub FormDelete_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Mybase.Load
' 画面初期設定
Me.ClearForm()
End Sub
'----------<< 検索ボタン押下処理 >>----------
Private Sub BtnRetrieval_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BtnRetrieval.Click
Try
' 社員データ削除クラスのインスタンス生成
Dim shain As New ClsDeleteShain(Me.TxtShainCode.Text)
Me.LblShainShimei.Text = shain.ShainShimei
Me.LblShainKana.Text = shain.ShainKana
' 部署データ選択クラスのインスタンス生成
Dim busho As New ClsSelectBusho(shain.BushoCode)
Me.LblBushoMei.Text = busho.BushoMei
' 社員コード・検索ボタン入力不可
Me.TxtShainCode.Enabled = False
Me.BtnRetrieval.Enabled = False
Me.BtnDelete.Enabled = True
' 削除ボタンにフォーカス
Me.BtnDelete.Focus()
Catch ex As myShainCodeException
' 社員コードエラー
MessageBox.Show(ex.Message, "社員コードエラー")
Me.TxtShainCode.Focus()
Catch ex As myDBIOException
' DBアクセスクラス独自例外発生時
MessageBox.Show(ex.Message, "DBIO例外発生")
Catch ex As Exception
' その他例外発生時
MessageBox.Show(ex.ToString, "例外発生")
End Try
End Sub
'----------<< 削除ボタン押下処理 >>----------
Private Sub BtnDelete_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BtnDelete.Click
Try
' 社員マスターレコード削除処理
Dim shain As New ClsDeleteShain
shain.DeleteKeyRecord(Me.TxtShainCode.Text)
' 画面初期設定
Me.ClearForm()
' 正常終了
MessageBox.Show("正常に削除されました", "削除処理")
Catch ex As myDBIOException
' DBアクセスクラス独自例外発生時
MessageBox.Show(ex.Message, "DBアクセスエラー")
Catch ex As Exception
' その他例外発生時
MessageBox.Show(ex.ToString, "例外発生")
End Try
End Sub
'----------<< クリアボタン押下処理 >>----------
Private Sub BtnClear_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BtnClear.Click
' 画面初期設定
Me.ClearForm()
' 社員コードにフォーカス
Me.TxtShainCode.Focus()
End Sub
'----------<< 画面初期設定 >>----------
Private Sub ClearForm()
Me.TxtShainCode.Text = Nothing
Me.LblShainShimei.Text = Nothing
Me.LblShainKana.Text = Nothing
Me.LblBushoMei.Text = Nothing
' 社員コード・検索ボタン入力不可
Me.TxtShainCode.Enabled = True
Me.BtnRetrieval.Enabled = True
Me.BtnDelete.Enabled = False
End Sub
End Class
====================================================================
【社員データクラス】
派生クラスで、引数なしのコンストラクタのほかに、引数に社員コードを指
定するコンストラクタを追加しました。
--【プログラムソースリスト(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
Private bushoCodeValue 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 Property BushoCode() As String
' Getプロパティ
Get
Return bushoCodeValue
End Get
' Setプロパティ
Set(ByVal value As String)
' 【エラーチェック】
If value.Length = 0 Then
' 未入力はエラー
Throw New myBushoCodeException _
("部署コードを入力してください")
Else
' 数字なら正常
If Regex.IsMatch(value, "^[0-9]+$") Then
Dim dbIO As New ClsBushoTableIO
' 部署マスタにあれば正常
If dbIO.ExistKeyData(value) = True Then
bushoCodeValue = value
Else
Throw New myBushoCodeException _
("部署コードはありません")
End If
Else
Throw New myBushoCodeException _
("部署コードに数字以外の文字があります")
End If
End If
End Set
End Property
'--------------------------------------------------------
' プロパティ:更新日時
'--------------------------------------------------------
Public ReadOnly Property KoushinNichiji() As DateTime
' Getプロパティ
Get
Return koushinNichijiValue
End Get
End Property
'**********************************************************
' 機能:社員テーブルの行データ生成
' 引数:なし
' 返値:生成した行データ
'******1*********2*********3*********4*********5**********6
Public Function CreateDataRow() As DataRow
Dim retRow As DataRow ' リターン値
Dim dbIO As New ClsShainTableIO
retRow = dbIO.CreateDataRow()
Return retRow
End Function
End Class
'//////// サブ抽象クラス:社員データ選択更新削除クラス ////////
Public MustInherit Class ClsShainSub
Inherits ClsShainBase
'=======================================================
' 機能:コンストラクタ
' 引数:なし
'=======================================================
Protected Sub New()
MyBase.New() ' 基本クラスのコンストラクタを呼び出す
End Sub
'=======================================================
' 機能:コンストラクタ
' 引数:社員コード
'=======================================================
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.ShainCodeValue = shainCode
MyBase.ShainShimei = CStr(dt.Rows(0)("社員氏名"))
MyBase.ShainKana = CStr(dt.Rows(0)("社員カナ"))
MyBase.BushoCode = 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
'////////// 派生クラス:社員データ削除クラス //////////
Public Class ClsDeleteShain
Inherits ClsShainSub
'========================================================
' 機能:コンストラクタ
' 引数:なし
'========================================================
Public Sub New()
MyBase.New()
End Sub
'========================================================
' 機能:コンストラクタ
' 引数:社員コード
'========================================================
Public Sub New(ByVal shainCode As String)
MyBase.New(shainCode)
End Sub
'********************************************************
' 機能:社員テーブルの1レコードを削除するメソッド
' 引数:削除するレコードの社員コード
' 戻値:削除したレコード数
'****1*********2*********3*********4*********5**********6
Public Function _
DeleteKeyRecord(ByVal shainCode As String) As Integer
Dim retDeleteCount As Integer ' リターン値
Dim dbIO As New ClsShainTableIO()
' レコードの削除
retDeleteCount = dbIO.DeleteKeyRecord(shainCode)
Return retDeleteCount
End Function
End Class
====================================================================
【sampleDBアクセスクラスの改良修正点】
Try … Catch … End Try をはずして、エラー発生時はそのまま例外をス
ローするように修正しました。
--【プログラムソースリスト(ClsSampleDBIO.vb)】--------------------
Option Strict On
Imports System.Configuration ' [参照の削除]から削除
Imports System.Data.SqlClient
Imports System.Transactions ' [参照の削除]から削除
'////////// 基本クラス:sampleDBアクセスクラス //////////
Public MustInherit Class ClsSampleDBIO
'==========================================================
' 機能:コンストラクタ
' 引数:なし
'==========================================================
Public Sub New()
MyBase.New()
End Sub
'**********************************************************
' 機能:テーブルキー値のレコードの有無を調べるメソッド
' 引数:テーブル名
' 引数:キーフィールド名
' 引数:主キー値
' 戻値:レコードあり-->True、レコードなし-->False
' 補足:主キーフィールドはNChar型とする
'******1*********2*********3*********4*********5**********6
Public Function ExistKeyData(ByVal tableName As String, _
ByVal keyField As String, _
ByVal keyCode As String) _
As Boolean
Dim retExist As Boolean ' リターン値
Using con As New SqlConnection
Using cmd As New SqlCommand
' 接続関連プロパティ設定
Me.SetConnection(con, cmd)
' SQL文設定
cmd.CommandText = "SELECT COUNT(*) FROM " & _
tableName & _
" WHERE " & keyField & " = @KeyCode"
' SQL文の引数設定
cmd.Parameters.Clear()
' パラメータの実際のサイズからデータ長を推論
cmd.Parameters.Add("@KeyCode", SqlDbType.NChar)
' コマンド引数に値を設定
cmd.Parameters("@KeyCode").Value = keyCode
' DB接続を開く
con.Open()
' レコード件数取得
Dim count As Integer = CInt(cmd.ExecuteScalar())
If count = 1 Then
' レコードが1件あれば、Trueを返す
retExist = True
Else
' そうでなければ、Falseを返す
retExist = False
End If
End Using
End Using
' ◆戻値を設定してリターン
Return retExist
End Function
'**********************************************************
' 機能:引数に指定したテーブルのキー値のレコードを取得する
' 引数:テーブル名
' 引数:キーフィールド名
' 引数:主キー値
' 戻値:取得したレコード
' 補足:テーブル名の主キーフィールドはNChar型とする
'******1*********2*********3*********4*********5**********6
Public Function GetKeyData(ByVal tableName As String, _
ByVal keyField As String, _
ByVal keyCode 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 & " = @keyCode"
' SQL文の引数設定
cmd.Parameters.Clear()
' パラメータの実際のサイズからデータ長を推論
cmd.Parameters.Add("@keyCode", SqlDbType.NChar)
' コマンド引数に値を設定
cmd.Parameters("@KeyCode").Value = keyCode
' レコード取得
Dim da As New SqlDataAdapter
da.SelectCommand = cmd
da.Fill(retDt)
End Using
End Using
' ◆戻値を設定してリターン
Return retDt
End Function
'**********************************************************
' 機能:引数に指定したテーブルのキー値のレコードを削除する
' 引数:テーブル名
' 引数:キーフィールド名
' 引数:主キー値
' 戻値:削除したレコード数
' 補足:テーブル名の主キーフィールドはNChar型とする
'******1*********2*********3*********4*********5**********6
Public Function _
DeleteKeyData(ByVal tableName As String, _
ByVal keyField As String, _
ByVal keyCode As String) As Integer
Dim retDeleteCount As Integer 'リターン値
'----------<< レコード削除 >>----------
' トランザクション開始
Using tran As New TransactionScope
Using con As New SqlConnection
Using cmd As New SqlCommand
' 接続関連プロパティ設定
Me.SetConnection(con, cmd)
' SQL文設定
cmd.CommandText = "DELETE FROM " & tableName & _
" WHERE " & keyField & " = @keyCode"
' SQL文の引数設定
cmd.Parameters.Clear()
' パラメータの実際のサイズからデータ長を推論
cmd.Parameters.Add("@keyCode", SqlDbType.NChar)
' コマンド引数に値を設定
cmd.Parameters("@KeyCode").Value = keyCode
' DB接続を開く
con.Open()
' レコード削除を実行
retDeleteCount = cmd.ExecuteNonQuery()
End Using
End Using
If retDeleteCount = 1 Then
' 1レコード削除なら正常(通常これしかありえない)
' トランザクション完了(コミット)
tran.Complete()
Else
' 1レコード削除以外なら例外をスロー
' コミットしなければ、自動的にロールバックされる
Throw New myDBIOException _
("エラー:削除処理に失敗")
End If
End Using
' ◆戻値を設定してリターン
Return retDeleteCount
End Function
'**********************************************************
' 機能:社員テーブルの行データ生成
' 引数:テーブル名
' 引数:キーフィールド名
' 戻値:生成した行データ
'******1*********2*********3*********4*********5**********6
Public Function CreateDataRow(ByVal tableName As String, _
ByVal keyField As String) _
As DataRow
Dim retRow As DataRow ' リターン値
Dim dt As New DataTable
' 列情報を取込むために、レコードを取得するが
' 取得できなくてもよいので、第三引数のキー値は何でも良い
dt = Me.GetKeyData(tableName, keyField, "_")
retRow = dt.NewRow
Return retRow
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.sampleDBConStr")
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.Data.SqlClient
Imports System.Text.RegularExpressions
Imports System.Transactions ' [参照の追加]で追加
Public Class ClsShainTableIO
Inherits ClsSampleDBIO
'==========================================================
' 機能:コンストラクタ
' 引数:なし
'==========================================================
Public Sub New()
MyBase.New()
End Sub
'**********************************************************
' 機能:社員テーブル主キー値レコードの有無を調べるメソッド
' 引数:社員コード
' 戻値:レコードあり --> True、レコードなし --> False
'******1*********2*********3*********4*********5**********6
Public Overloads Function _
ExistKeyData(ByVal shainCode As String) As Boolean
Dim retExist As Boolean ' リターン値
' 引数の空文字列チェック
If shainCode.Length = 0 Then
Throw New myShainCodeException _
("社員コードが未入力")
End If
' キー値文字チェック(キー値は数字のみで構成されている)
If Not Regex.IsMatch(shainCode, "^[0-9]+$") Then
' 数字以外はエラー
Throw New myShainCodeException _
("社員コードに数字以外の文字があります")
End If
' キー値長さチェック(社員コードは5桁)
If Not shainCode.Length = 5 Then
' 5桁以外はエラー
Throw New myShainCodeException _
("社員コードの桁数が正しくない")
End If
' 社員テーブルに引数のレコードが存在するかチェックする
retExist = MyBase.ExistKeyData _
("社員テーブル", "社員コード", shainCode)
' ◆戻値を設定してリターン
Return retExist
End Function
'**********************************************************
' 機能:引数のレコードを社員テーブルから取得する
' 引数:社員コード
' 戻値:引数に指定した社員コードのレコード
'******1*********2*********3*********4*********5**********6
Public Overloads Function _
GetKeyData(ByVal shainCode As String) As DataTable
Dim retDt As New DataTable ' リターン値
' 引数の空文字列チェック
If shainCode.Length = 0 Then
Throw New myShainCodeException _
("社員コードが未入力")
End If
' キー値文字チェック(キー値は数字のみで構成されている)
If Not Regex.IsMatch(shainCode, "^[0-9]+$") 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
'**********************************************************
' 機能:社員テーブルから1レコードを削除するメソッド
' 引数:削除する社員コード
' 戻値:削除したレコード数
'******1*********2*********3*********4*********5**********6
Public Overloads Function _
DeleteKeyRecord(ByVal shainCode As String) As Integer
Dim retDeleteCount As Integer ' リターン値
' キー値のレコード存在チェック
If Me.ExistKeyData(shainCode) = True Then
' レコードが存在すれば削除
retDeleteCount = MyBase.DeleteKeyData _
("社員テーブル", "社員コード", shainCode)
Else
' レコードが存在しなければ例外をスロー
Throw New myDBIOException _
("社員コードのレコードが存在しません")
End If
' ◆戻値を設定してリターン
Return retDeleteCount
End Function
'**********************************************************
' 機能:社員マスターの行データ生成
' 引数:なし
' 戻値:生成した行データ
'******1*********2*********3*********4*********5**********6
Public Overloads Function CreateDataRow() As DataRow
Dim retRow As DataRow ' リターン値
retRow = MyBase.CreateDataRow("社員テーブル", "社員コード")
Return retRow
End Function
End Class
====================================================================
【部署データ管理クラスの追加】
部署データ管理クラスを新規に作成しました。
--【プログラムソースリスト(ClsBusho.vb)】------------------
Option Strict On
Imports System.Text.RegularExpressions
'////////// 基本クラス:部署データクラス //////////
Public MustInherit Class ClsBushoBase
'----------<< メンバ:変数 >>----------
Protected bushoCodeValue As String
Private bushoMeiValue As String
Protected koushinNichijiValue As DateTime
'========================================================
' 機能:コンストラクタ
' 引数:なし
'========================================================
Protected Sub New()
MyBase.New() ' 基本クラスのコンストラクタを呼び出す
End Sub
'--------------------------------------------------------
' プロパティ:部署名
'--------------------------------------------------------
Public Property BushoMei() As String
' Getプロパティ
Get
Return bushoMeiValue
End Get
' Setプロパティ
Set(ByVal value As String)
' 【エラーチェック】
If value.Length = 0 Then
' 未入力はエラー
Throw New myBushoMeiException _
("部署名を入力してください")
Else
BushoMeiValue = value
End If
End Set
End Property
'--------------------------------------------------------
' プロパティ:更新日時
'--------------------------------------------------------
Public ReadOnly Property KoushinNichiji() As DateTime
' Getプロパティ
Get
Return koushinNichijiValue
End Get
End Property
End Class
'//////// 派生抽象クラス:部署データ選択更新削除クラス ////////
Public MustInherit Class ClsBushoSub
Inherits ClsBushoBase
'=======================================================
' 機能:コンストラクタ
' 引数:なし
'=======================================================
Protected Sub New()
MyBase.New() ' 基本クラスのコンストラクタを呼び出す
End Sub
'=======================================================
' 機能:コンストラクタ
' 引数:部署コード
'=======================================================
Protected Sub New(ByVal bushoCode As String)
MyBase.New() ' 基本クラスのコンストラクタを呼び出す
' ---<< 部署テーブルからレコード取得 >>---
Dim bushoTable As New ClsBushoTableIO
Dim dt As DataTable
' レコード取得メソッド呼出
dt = bushoTable.GetKeyData(bushoCode)
If dt.Rows.Count = 1 Then
' レコードがあった時
MyBase.BushoCodeValue = bushoCode
MyBase.BushoMei = CStr(dt.Rows(0)("部署名"))
MyBase.KoushinNichijiValue = _
CDate(dt.Rows(0)("更新日時"))
Else
' レコードが無かった時
Throw New myBushoCodeException _
("部署テーブルにレコードがありません")
End If
End Sub
'--------------------------------------------------------
' プロパティ:部署コード
'--------------------------------------------------------
Public ReadOnly Property BushoCode() As String
' Getプロパティ
Get
Return bushoCodeValue
End Get
End Property
End Class
'//////// 派生クラス:部署データ選択クラス ////////
Public Class ClsSelectBusho
Inherits ClsBushoSub
Private bushoDataValue As DataTable
'=======================================================
' 機能:コンストラクタ
' 引数:なし
'=======================================================
Public Sub New(ByVal bushoCode As String)
MyBase.New(bushoCode)
End Sub
' 削除処理では不要のため以下省略
End Class
====================================================================
【部署テーブルアクセスクラスの追加】
部署テーブルアクセスクラスを新規に作成しました。
--【プログラムソースリスト(ClsBushoTableIO.vb)】------------------
Option Strict On
Imports System.Data.SqlClient
Imports System.Text.RegularExpressions
Imports System.Transactions ' [参照の追加]で追加
'////////// 派生クラス:部署テーブルアクセスクラス //////////
Public Class ClsBushoTableIO
Inherits ClsSampleDBIO
'==========================================================
' 機能:コンストラクタ
' 引数:なし
'==========================================================
Public Sub New()
MyBase.New()
End Sub
'**********************************************************
' 機能:キー値のレコードの有無を調べるメソッド
' 引数:部署コード
' 戻値:レコードあり-->True、レコードなし-->False
' 補足:主キーフィールドはNChar型とする
'******1*********2*********3*********4*********5**********6
Public Overloads Function _
ExistKeyData(ByVal bushoCode As String) As Boolean
Dim retExist As Boolean ' リターン値
' 引数の空文字列チェック
If bushoCode.Length = 0 Then
Throw New myBushoCodeException _
("部署コードが未入力です")
End If
' キー値文字チェック(キー値は数字のみで構成されている)
If Not Regex.IsMatch(bushoCode, "^[0-9]+$") Then
' 数字以外はエラー
Throw New myBushoCodeException _
("部署コードに数字以外の文字があります")
End If
' キー値長さチェック(部署コードは4桁)
If Not bushoCode.Length = 4 Then
' 4桁以外はエラー
Throw New myBushoCodeException _
("部署コードの桁数が正しくない")
End If
' 引数のレコードの有無をチェックする
retExist = MyBase.ExistKeyData _
("部署テーブル", "部署コード", bushoCode)
' ◆戻値を設定してリターン
Return retExist
End Function
'**********************************************************
' 機能:引数のレコードを部署テーブルから取得する
' 引数:部署コード
' 戻値:引数に指定した部署コードのレコード(DataTble型)
' 補足:主キーフィールドはNChar型とする
'******1*********2*********3*********4*********5**********6
Public Overloads Function _
GetKeyData(ByVal bushoCode As String) As DataTable
Dim retDt As New DataTable ' リターン値
' 引数の空文字列チェック
If bushoCode.Length = 0 Then
Throw New mybushoCodeException _
("部署コードが未入力")
End If
' キー値文字チェック(キー値は数字のみで構成されている)
If Not Regex.IsMatch(bushoCode, "^[0-9]+$") Then
' 数字以外はエラー
Throw New mybushoCodeException _
("部署コードに数字以外の文字があります")
End If
' キー値長さチェック(部署コードは4桁)
If Not bushoCode.Length = 4 Then
' 4桁以外はエラー
Throw New mybushoCodeException _
("部署コードの桁数が正しくない")
End If
' 部署テーブルから引数コードのレコードを取得する
retDt = MyBase.GetKeyData _
("部署テーブル", "部署コード", bushoCode)
' ◆戻値を設定してリターン
Return retDt
End Function
' 削除処理では不要のため以下省略
End Class
--------------------------------------------------------------------
次号から注文伝票入力を始めます。ヘッダーとデータグリッドビューを使っ
た明細行の入力、注文テーブルと明細テーブルへの登録を予定しています。
====================================================================
【お詫び】
70号と71号に掲載漏れがありました。皆様にお詫び申し上げます。
▲このページ先頭へ | すぐ使えるADO.NET ホームへ
Copyright© すぐ使えるADO.NET. All rights reserved.