バックナンバー【第59号】
ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。
【第59号】
第59号(2007.12.12発行) ====================================================================== ★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★ (VB 2005 Express & SQL Server 2005 Express) ---------------------------------------------------------------------- いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中 心に掲載します。今後ともよろしくお願い申し上げます。 すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/ ====================================================================== ■■ 社員テーブルに追加する 1 ■■ 社員コード、社員氏名、カナ名、部署コードを入力して、追加ボタンをクリッ クすると、入力したデータのエラーチェックをして、エラーが無ければ、社員 テーブルに1レコード追加します。接続文字列は、app.configに登録しておき ます。 【sampleデータベースの社員テーブル】 ---------------------------------------------------------------------- key 列 名 データ型 nullを許容 備 考 ---------------------------------------------------------------------- ○ 社員コード nchar(5) 許容しない 英数字のみ − 社員氏名 nvarchar(20) 許容しない − 社員カナ nvarchar(40) 許容しない − 部署コード nchar(4) 許容しない − 更新日時 datetime 許容しない ---------------------------------------------------------------------- 【sampleデータベースの部署テーブル】 ---------------------------------------------------------------------- key 列 名 データ型 nullを許容 備 考 ---------------------------------------------------------------------- ○ 部署コード nchar(4) 許容しない 英数字のみ − 部署名 nvarchar(20) 許容しない − 更新日時 datetime 許容しない ---------------------------------------------------------------------- コンボボックスのDropDownStyleプロパティは、DropDownListを選択して、テ キストボックス部分を入力できないように設定します。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ 社員テーブル追加 _□×┃ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃ Label1 TxtShainCode ┃┌―――――┐ ┌―――――┐ ┃│社員コード│ │ │ ┃└―――――┘ └―――――┘ ┃ Label2 TxtShainShimei ┃┌―――――┐ ┌――――――――┐ ┃│社員氏名 │ │ │ ┃└―――――┘ └――――――――┘ ┃ Label3 TxtShainKana ┃┌―――――┐ ┌――――――――――――――┐ ┃│社員カナ │ │ │ ┃└―――――┘ └――――――――――――――┘ ┃ Label4 CboBusho ┃┌―――――┐ ┌――――――――┐ ┃│部署コード│ │ │▼│ ┃└―――――┘ └――――――――┘ ┃ BtnInsert BtnClear ┃┌――――┐ ┌―――――┐ ┃│ 追加 │ │ クリア │ ┃└――――┘ └―――――┘ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 【追加ボタンクリック処理】 よくあるパターンは、エラーチェック、画面制御、データベースアクセスなど、 すべての処理をここにコーディングしてしまうことです。追加ボタンクリック 処理は、できる限り画面制御処理に専念します。 そのために、入力データのエラーチェックは、社員データクラスに、レコード 追加処理や検索処理は、データベースアクセスクラスに任せます。 【フォームロード処理】 この処理では、部署名をコンボボックスに表示して、選択した部署名に対応す る部署コードを取得できるようにします。 ---------------------------------------------------------------------- ■■ 全レコードを取得するGetAllDataメソッド ■■ 部署名をコンボボックスに表示するために、基本クラスClsSampleDBIO から派 生した ClsBushoTableIOクラスを作成して、部署テーブルの全レコードを取得 する GetAllDataメソッドを追加します。 さらに、GetKeyDataメソッドと同様に、基本クラスにもGetAllDataメソッドを 追加して、データベースアクセス処理をコーディングします。 ClsBushoTableIOクラスの GetAllDataメソッドは、引数を3つ指定できます。 最初の引数は必須で、他の2つは任意とします。したがって、先頭にOptional キーワードをつけて、 Optional ByVal SortKey As String = Nothing とします。 GetAllDataメソッドを、ClsBushoTableIOクラスに追加します。 ClsBushoTableIO.vbファイルを新規に追加してください。 --【プログラムソースリスト(ファイル名:ClsBushoTableIO.vb)】-------- Imports System.Configuration '参照の追加でSystem.Configurationを追加 Imports System.Data.SqlClient Imports System.Text.RegularExpressions Public Class ClsBushoTableIO Inherits ClsSampleDBIO '******************************************************************* ' 機能:コンストラクタ ' 引数:なし '******1*********2*********3*********4*********5**********6********* Sub New() MyBase.New() '必ず最初に基本クラスのコンストラクタを呼び出す End Sub '******************************************************************* ' 機能:部署テーブルから引数にした列名の全レコードを取得する ' 引数:必須 ByVal 部署テーブルの取得する列名(String型配列) ' 引数:任意 ByVal 整列する列名(String型) ' 引数:任意 ByVal 昇順ならTrue、降順ならFalse(Boolean型) ' 戻値:部署テーブルの全レコード(DataTble型) '******1*********2*********3*********4*********5**********6********* Public Overloads _ Function GetAllData _ (ByVal Columns() As String, _ Optional ByVal SortKey As String = Nothing, _ Optional ByVal Sorted As Boolean = True _ ) As DataTable Dim retDt As New DataTable() '戻値 Try '引数Nothing(未設定)・空白チェック If Columns.Length = 0 Then Throw New myDBIOException("エラー:引数Columnsが未設定") End If '部署テーブルから引数列名の全レコードを取得する retDt = MyBase.GetAllData _ ("部署テーブル", Columns, SortKey, Sorted) Catch ex As myDBIOException Throw New myDBIOException(ex.Message) Catch ex As Exception Throw New Exception("例外発生:" & ex.ToString) End Try '◆戻値を設定してリターン Return retDt End Function End Class ---------------------------------------------------------------------- 基本クラスClsSampleDBIOの GetAllDataメソッドでは、引数のテーブル名と列 名のエラーチェックをします。 コネクションオブジェクトの GetSchemaメソッドを呼出すと、テーブル名や列 名が、メソッドの戻り値 DataTable型として取得できます。テーブル名を取得 する場合には dtTableName = con.GetSchema("Tables") とします。同様にして、部署テーブルの列名も取得できます。第2引数でテー ブル名を指定して列名を取得します。 dtColumns = con.GetSchema _ ("Columns", New String() {Nothing, Nothing, "部署テーブル", Nothing}) GetSchemaメソッドで取得した列名とテーブル名を、引数で指定した値をチェッ クしながら、 SELECT 列名(0), .... 列名(N) FROM 部署テーブル ORDER BY 列名 ASC のようなSQL文を作成していきます。そして、完成したSQL文を使って、テーブ ルから全レコードを取得します。 基本クラスの GetAllDataメソッドを、ClsSampleDBIOクラスに追加します。 --【プログラムソースリスト(ファイル名:ClsSampleDBIO.vb)】---------- '******************************************************************* ' 機能:引数に指定したテーブルの全レコードを取得する ' 引数:必須 ByVal テーブル名(String型) ' 引数:必須 ByVal 取得する列名(String型配列) ' 引数:任意 ByVal 整列する列名(String型) ' 引数:任意 ByVal 昇順ならTrue、降順ならFalse(Boolean型) ' 戻値:引数に指定したテーブルの全レコード(DataTble型) '******1*********2*********3*********4*********5**********6********* Public Function GetAllData _ (ByVal TableName As String, _ ByVal Columns() As String, _ Optional ByVal SortKey As String = Nothing, _ Optional ByVal Sorted As Boolean = True _ ) As DataTable Dim retDt As New DataTable() '戻値 Try Using con As New SqlConnection Using cmd As New SqlCommand '----------< 引数が未設定だったら例外をスロー >---------- If TableName = Nothing Then Throw New myDBIOException("引数エラー:TableNameが未設定") End If If Columns.Length = 0 Then Throw New myDBIOException("引数エラー:Columnsが未設定") End If '----------< テーブル名取得、列名取得 >---------- Dim dtTableName As DataTable Dim dtColumns As DataTable '接続関連プロパティ設定 Me.SetConnection(con, cmd) 'DB接続を開く con.Open() 'テーブル名を取得 dtTableName = con.GetSchema("Tables") '列名を取得 dtColumns = con.GetSchema _ ("Columns", New String() {Nothing, Nothing, TableName, Nothing}) 'DB接続を閉じる con.Close() '----------< SQL文の生成 >---------- Dim existFlg As Boolean = False cmd.Parameters.Clear() cmd.CommandText = "SELECT " '列名の設定 If Columns(0) = "*" Then '全列名指定の場合 cmd.CommandText &= Columns(0) & " " Else '特定列名指定の場合 For i As Integer = 0 To Columns.Length - 1 '列名存在チェック For j As Integer = 0 To dtColumns.Rows.Count - 1 If Columns(i) = dtColumns.Rows(j)("COLUMN_NAME").ToString Then existFlg = True Exit For End If Next j '列名が存在すれば、SQL文に連結 If existFlg = True Then cmd.CommandText &= Columns(i) '最後の列名以外「,」を連結 If i < Columns.Length - 1 Then cmd.CommandText &= "," End If existFlg = False Else '列名が存在しなければ、例外をスロー Throw New myDBIOException _ ("エラー:" & Columns(i) & "の列名は存在しない") End If Next i End If 'テーブル名の設定 For i As Integer = 0 To dtTableName.Rows.Count - 1 'テーブル名存在チェック If TableName = dtColumns.Rows(i)("TABLE_NAME").ToString Then existFlg = True Exit For End If Next i 'テーブル名が存在すれば、テーブル名をSQL文に連結 If existFlg = True Then cmd.CommandText &= " FROM " & TableName Else 'テーブル名が存在しなければ、例外をスロー Throw New myDBIOException _ ("エラー:" & TableName & "は存在しない") End If '整列の設定 If Not SortKey = Nothing Then For i As Integer = 0 To Columns.Length - 1 '整列キーの列名存在チェック If SortKey = dtColumns.Rows(i)("COLUMN_NAME").ToString Then existFlg = True Exit For End If Next i '整列キーの列名が存在すれば、列名をSQL文に連結 If existFlg = True Then cmd.CommandText &= " ORDER BY " & SortKey '整列キーの昇順または降順をSQL文に連結 If Sorted = True Then cmd.CommandText &= " ASC" Else cmd.CommandText &= " DESC" End If Else '整列キーの列名が存在しなければ、例外をスロー Throw New myDBIOException _ ("エラー:" & SortKey & "の列名は存在しない") End If End If '----------< テーブルから全レコード取得 >---------- Dim da As New SqlDataAdapter da.SelectCommand = cmd da.Fill(retDt) End Using End Using Catch ex As Exception '例外が発生したら、例外をスロー Throw New Exception("例外発生:" & ex.ToString) End Try '----------< ◆戻値を設定してリターン >---------- Return retDt End Function ---------------------------------------------------------------------- 次号では、フォームロード処理や追加ボタンクリック処理などを作成します。 入力データエラーチェッククラスについても触れていきます。 ====================================================================== 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」ホームページで公開している ソースプログラム・データの利用により生じた損害等については、発行者は 一切責任を負いません。ソースプログラムの再利用は自由です。著作権は発行 者が所有します。 このメールマガジン及び「すぐ使えるADO.NET」ホームページに掲載されてい る会社名・製品名等は、各社の登録商標または商標です。 ======================================================================
↑このページ(メルマガ:VB.NETデータベース) 先頭へ | すぐ使えるADO.NET ホームへ
Copyright© すぐ使えるADO.NET. All rights reserved.