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