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