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