OleDbDataReaderからフィールドのデータ型を指定して値を取得するサンプル

図 OleDb DataReaderからフィールドのデータ型を指定して値を取得するサンプル
このサンプルは、AccessのNwind.mdbデータベースの得意先テーブルからレコードを抽出して表示します。OleDbDataReaderからはフィールド(カラム)のデータ型を指定して値を取得します。
このサンプルでは、以下のノウハウを習得することができます。
▲ SQLのSelect Topオプションの使い方
▲ OleDbDataReaderのRead()メソッドの使い方
▲ OleDbDataReaderからフィールドのデータ型を指定して値を取得する方法
▲ IsDBNull()メソッドの使い方
サンプルのPage_Load()イベントでは、AccessのNwind.mdbデータベースから得意先テーブルのレコードを抽出して表示します。行7では、得意先テーブルからレコードを抽出するSQLを生成しています。SelectステートメントのTop 5は、得意先テーブルの先頭から5件のレコードを抽出することを意味します。行8-10では、OleDbConnectionとOleDbCommandのインスタンスを生成しています。
行13では、OleDbConnectionのOpen()メソッドでAccessのNwind.mdbデータベースを開いています。行14では、OleDbCommandのExecuteReader()メソッドで得意先テーブルのOleDbDataReaderを生成しています。行15-17では、OleDbDataReaderのGetOrdinal()メソッドでフィールド(カラム)のインデックス番号(Ordinal Number)を取得して変数に保存しています。GetOrdinal()メソッドの引数には、フィールド名を指定します。
行18-25のWhile…End Whileでは、OleDbDataReaderのRead()メソッドでEOFになるまで得意先テーブルのレコードを読み込んでいます。行19-23のWith…End Withでは、LabelのTextプロパティに得意先テーブルの得意先名、担当者名、電話番号を設定しています。OleDbDataReaderからフィールド値を取得するとき、データ型を指定しています。たとえば、文字型のフィールド値を取得するときは、GetString()メソッドを使用します。GetString()メソッドの引数には、フィールドのインデックス番号を指定します。
intProductID = myDataReader.GetInt32(intProductIDOrdinal)
strProductName = myDataReader.GetString(intProductNameOrdinal)
If Not myDataReader.IsDBNull(intUnitPriceOrdinal) Then
decUnitPrice = myDataReader.GetDecimal(intUnitPriceOrdinal)
Else
decUnitPrice = 0
End If
データ型を指定して値を取得するときは、データ型の変換が行われないため高速です。フィールドにNullが含まれるときは、IsDBNull()メソッドで事前に確認する必要があります。
行26では、OleDbDataReaderのClose()メッドで得意先テーブルを閉じています。行27では、OleDbConnectionのClose()メソッドでAccessのNwind.mdbデータベースを閉じています。
6: Sub Page_Load()
7: Dim strSqlSelect As String = "Select
top 5 * From Customers;"
8: Dim con As New OleDbConnection( _
9:
ConfigurationSettings.AppSettings("conStringAccNw"))
10: Dim cmd As New
OleDbCommand(strSqlSelect, con)
11: Dim intRecordCount As Integer
12:
13: con.Open()
14: Dim dr As OleDbDataReader =
cmd.ExecuteReader()
15: Dim intCompanyName As Integer =
dr.GetOrdinal("CompanyName")
16: Dim intContactName As Integer =
dr.GetOrdinal("ContactName")
17: Dim intPhone As Integer =
dr.GetOrdinal("Phone")
18: While dr.Read()
19: With lblMessage
20: .Text &=
String.Format("得意先名:<b>{0}</b><br>",
dr.GetString(intCompanyName))
21: .Text &=
String.Format("担当者名:<b>{0}</b><br>",
dr.GetString(intContactName))
22: .Text &=
String.Format("電話番号:<b>{0}</b><hr>", dr.GetString(IntPhone))
23: End With
24: intRecordCount += 1
25: End While
26: dr.Close()
27: con.Close()
28: lblMessage.Text &= _
29:
String.Format("<b>{0}</b>件の得意先を抽出しました.", _
30:
intRecordCount.ToString())
31: End Sub