バックナンバー:VB.NETデータベースプログラミング
ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。
【第57号】
第57号(2007.9.20発行)
======================================================================
★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★
(VB 2005 Express & SQL Server 2005 Express)
----------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中
心に掲載します。今後ともよろしくお願い申し上げます。
すぐ使えるADO.NET --> http://park5.wakwak.com/‾weblab/
======================================================================
■■ 社員テーブルを検索する 2 ■■
検索ボタンをクリックすると、入力した社員コードのエラーチェックをして、
エラーが無ければ、社員テーブルから該当レコードを取得し、社員氏名と社員
カナを表示します。接続文字列は、app.configに登録します(前号参照)。
【sampleデータベースの社員テーブル】
----------------------------------------------------------------------
key 列 名 データ型 nullを許容 備 考
----------------------------------------------------------------------
○ 社員コード nchar(5) 許容しない 社員コードは英数字のみ
− 社員氏名 nvarchar(20) 許容しない
− 社員カナ nvarchar(40) 許容しない
− 部署コード nchar(4) 許容しない
− 更新日時 datetime 許容しない
----------------------------------------------------------------------
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 社員テーブル検索 _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Label1 TxtShainCode BtnKensaku
┃┌―――――┐ ┌―――――┐ ┌――――┐
┃│社員コード│ │ │ │ 検索 │
┃└―――――┘ └―――――┘ └――――┘
┃ Label2 LblShainShimei
┃┌―――――┐ ┌――――――――┐
┃│社員氏名 │ │ │
┃└―――――┘ └――――――――┘
┃ Label3 LblShainKana
┃┌―――――┐ ┌――――――――┐
┃│社員カナ │ │ │
┃└―――――┘ └――――――――┘
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
前号の検索ボタン押下時の処理を、ClsShainTableIOクラスを呼び出すように
修正します。
そのために、sampleデータベースをアクセスする基本クラスClsSampleDBIOと、
社員テーブル用に独自処理をする派生クラスClsShainTableIOを作成します。
【修正後のソースリスト】
Public Class Form056
'====================<< 検索ボタン押下時 >>====================
Private Sub BtnKensaku_Click _
(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles BtnKensaku.Click
Dim shainTable As New ClsShainTableIO
Dim dt As New DataTable
Try
dt = shainTable.GetKeyData(Me.TxtShainCode.Text)
If dt.Rows.Count = 1 Then
'レコードがあった時
Me.LblShainShimei.Text = CStr(dt.Rows(0)("社員氏名"))
Me.LblShainKana.Text = CStr(dt.Rows(0)("社員カナ"))
Else
'レコードが無い時
Me.LblShainShimei.Text = Nothing
Me.LblShainKana.Text = Nothing
MessageBox.Show _
("入力した社員コードのデータがありません", "入力エラー")
End If
Catch ex As myDBIOException
'DBIO独自例外発生時
Me.LblShainShimei.Text = Nothing
Me.LblShainKana.Text = Nothing
MessageBox.Show(ex.Message, "エラー発生")
Catch ex As Exception
MessageBox.Show(ex.ToString, "例外発生")
End Try
End Sub
End Class
----------------------------------------------------------------------
まず、基本クラスClsSampleDBIOでは、引数にテーブル名やSQL文の引数を指定
して、各テーブル共通のデータベースアクセス処理を作成します。
派生クラスClsShainTableIOでは、主に引数のエラーチェックをして、基本ク
ラスのメソッドを呼び出します。基本クラス・派生クラスとも、エラーがあれ
ば、独自例外myDBIOExceptionをスローします。
今回は、引数に指定したテーブルのキー値のレコードを取得するメソッド
GetKeyData()を基本クラスに作成します。
テーブル名の主キーフィールドのデータ型はNChar型として作成します。この
方式では、主キーに他のデータ型がある場合、別途そのデータ型用のメソッド
を作成する必要があります。したがって、sampleデータベースの各テーブルの
主キーのデータ型は、NChar型に統一します。
引数のエラーチェックは、派生クラスのGetKeyData()メソッドでしますので、
基本クラスのGetKeyData()メソッドでは、エラーチェックを省略して、基本ク
ラスの処理をシンプルにします。
接続文字列の取得や接続に関連したプロパティ設定の処理は、共通処理として、
SetConnection()メソッドにまとめます。ただし、外部から呼び出せないよう
に、Privateメソッドにします。
ClsSampleDBIOは、ClsSampleDBIO.vbファイルを追加して作成します。
--【プログラムソースリスト】------------------------------------------
Option Strict On 'プロジェクトのプロパティでも設定可能
Imports System.Configuration '参照の追加でSystem.Configurationを追加
Imports System.Data.SqlClient
Imports System.Text.RegularExpressions
Public Class ClsSampleDBIO
'-------------------------< メンバ:変数 >--------------------------
'コネクション
Private con As SqlConnection
'コマンド
Private cmd As SqlCommand
'*******************************************************************
' 機能:コンストラクタ
' 引数:なし
'******1*********2*********3*********4*********5**********6*********
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() 'リターン値
Try
Using con As New SqlConnection
Dim 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
Catch ex As Exception
Throw New Exception _
("ClsSampleDBIO.getKeyDataで例外発生:" & ex.ToString)
End Try
'----------< ◆戻値を設定してリターン >----------
Return retDt
End Function
'*******************************************************************
' 機能:接続関連プロパティ設定
' 引数:ByRef SqlConnectionオブジェクト
' 引数:ByRef SqlCommandオブジェクト
'******1*********2*********3*********4*********5**********6*********
Private Sub SetConnection(ByRef con As SqlConnection, _
ByRef cmd As SqlCommand)
Try
'----------< 接続関連プロパティ設定 >----------
'変数の宣言
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
Catch ex As Exception
Throw New Exception _
("clsSampleDBIO.setConnectionで例外発生." & ex.ToString)
End Try
End Sub
End Class
独自例外は、clsException.vbファイルを追加して作成します。
'--------------- DBIOクラスの独自例外クラス---------------
Public Class myDBIOException
Inherits ApplicationException
Public Sub New(ByVal errorMessage As String)
MyBase.New(errorMessage)
End Sub
End Class
----------------------------------------------------------------------
次号では、派生クラスのGetKeyData()メソッドを作成します。
----------------------------------------------------------------------
■■ SqlDbType 列挙体 ■■
cmd.Parameters.Add("@KeyValue", SqlDbType.NChar)
のSqlDbType.NCharは、SQL Serverのデータ型を指定するために使用する
SqlDbType列挙体です。SqlDbType列挙体のメンバを一覧表にまとめましたので
参考にしてください。
----------------------------------------------------------------------
SqlDbType列挙体メンバ VB 2005 での型
----------------------------------------------------------------------
SqlDbType.BigInt Int64
SqlDbType.Binary Byte型のArray 1〜8,000Byteまでの固定長
SqlDbType.Bit Boolean
SqlDbType.Char String Unicode以外の1〜8,000文字の固定長
SqlDbType.DateTime DateTime 1753/1/1〜9999/12/31の日付と時刻
SqlDbType.Decimal Decimal -10の38乗-1〜10の38乗-1の固定小数
SqlDbType.Float Double
SqlDbType.Image Byte型のArray 2,147,483,647Byteまでのバイナリ
SqlDbType.Int Int32
SqlDbType.Money Decimal -922,337,203,685,477.5808〜
+922,337,203,685,477.5807
SqlDbType.NChar String Unicode1〜4,000文字の固定長
SqlDbType.NText String Unicode1,073,741,823文字までの可変長
SqlDbType.NVarChar String Unicode1〜4,000文字の可変長
SqlDbType.Real Single
SqlDbType.SmallDateTime DateTime 1900/1/1〜2079/6/6の日付と時刻
SqlDbType.SmallInt Int16
SqlDbType.SmallMoney Decimal -214,748.3648〜+214,748.3647
SqlDbType.Text String Unicode以外2,147,483,647までの可変長
SqlDbType.Timestamp Byte型のArray 8Byte
SqlDbType.TinyInt Byte
SqlDbType.UniqueIdentifier Guid 128ビットの整数
SqlDbType.VarBinary Byte型のArray 1〜8,000Byteまでの可変長
SqlDbType.VarChar String Unicode以外1〜8,000文字の可変長
SqlDbType.Variant Object
----------------------------------------------------------------------
======================================================================
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.