バックナンバー: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.