.item Propertyでもデータ要素を参照できるようにした。
Default設定し、Class変数(i,j)でも参照できるようにした。
他、書式の統一化、Castの明示可などなど。
ちなみに、データを全てStringにしてるのは、Table化した際の扱いが楽なため。
Option Strict On '指定したDBを読み込み、テーブルで返す。 Public Class SetDBtoTable '---------- 'Variable '---------- Private _Provider As String Private _DataSource As String Private _ConnectionString As String Private _UserID As String Private _Password As String Private _RecordCount As Integer Private _ColumnCount As Integer Private _DataTable(,) As String 'テーブルデータ格納場所 '---------- 'Property '---------- '------------------------------ 'DBへアクセスするために必要なProperty群 '------------------------------ 'プロバイダ指定。Accessなら"Microsoft.Jet.OLEDB.4.0;"みたいなの Public Property Provider As String Get Return _Provider End Get Set(value As String) _Provider = value End Set End Property 'データソース指定。Accessならファイル名 Public Property DataSource As String Get Return _DataSource End Get Set(value As String) _DataSource = value End Set End Property 'コネクションストリング。テーブル名だったりSQLだったり Public Property ConnectionString As String Get Return _ConnectionString End Get Set(value As String) _ConnectionString = value End Set End Property 'ユーザーID。テストしてないから動くかどうかわからない( ゚-゚)~゚ Public Property UserID As String Get Return _UserID End Get Set(value As String) _UserID = value End Set End Property 'パスワード。テストしてな(以下略 Public Property Password As String Get Return _Password End Get Set(value As String) _Password = value End Set End Property '------------------------------ '得たデータを参照するProperty群 '------------------------------ 'レコード数 Public ReadOnly Property RecordCount As Long Get Return _RecordCount End Get End Property 'カラム数 Public ReadOnly Property ColumnCount As Long Get Return _ColumnCount End Get End Property 'Value Override群 Start Public Overridable ReadOnly Property Value As String(,) Get Return _DataTable End Get End Property Public Overridable ReadOnly Property Value(ByVal i As Integer) As String() Get Return (_Record(i)) End Get End Property Public Overridable ReadOnly Property Value(ByVal i As Integer, ByVal j As Integer) As String Get Return (_DataTable(i, j)) End Get End Property 'Value Override群 End 'Item Override群 Start Default Property指定 Default Public Overridable ReadOnly Property Item(ByVal i As Integer, ByVal j As Integer) As String Get Return (_DataTable(i, j)) End Get End Property Default Public Overridable ReadOnly Property Item(ByVal i As Integer) As String() Get Return (_Record(i)) End Get End Property 'Item Override群 End Public ReadOnly Property Record(ByVal i As Integer) As String() Get Return (_Record(i)) End Get End Property Public ReadOnly Property Column(ByVal j As Integer) As String() Get Return (_Column(j)) End Get End Property '---------- 'Constructor '---------- Public Sub New() Debug.Print("Constructor:" & TypeName(Me)) _Provider = "Microsoft.Jet.OLEDB.4.0;" End Sub '---------- 'Destructor '---------- Private Sub Class_Terminate() Debug.Print("Destructor:" & TypeName(Me)) End Sub '---------- 'Method '---------- 'DBにアクセスし、レコード数、カラム数、データ本体を読み込み、Class変数に代入 Public Function Open() As Boolean Dim OnOK As Boolean = True Dim cn As ADODB.Connection Dim rs As ADODB.Recordset cn = New ADODB.Connection rs = New ADODB.Recordset Dim i As Integer Dim j As Integer cn.Provider = _Provider '_ConnectionStringが空か確認。空であればエラーを吐きFalseを返してMethod終了 If _ConnectionString = Nothing Then Debug.Print("ERROR:" & TypeName(Me) & ":ConnectionString Property Not Assignment”) OnOK = False Return OnOK End If 'DataSourceが空か確認。空であればエラーを吐きFalseを返してMethod終了 If _DataSource = Nothing Then Debug.Print("ERROR:" & TypeName(Me) & ":DataSource Property Not Assignment”) OnOK = False Return OnOK End If 'DataSource設定 cn.Properties("Data Source").Value = _DataSource 'ID/Passwd設定(試してない If _UserID <> Nothing Then cn.Properties("UserID").Value = _UserID End If If _Password <> Nothing Then cn.Properties("Password").Value = _Password End If '_ConnectionString(テーブ名やSQL。DELETEとか書かれても、 'rs.open()のときにReadOnlyで開くからはじけると思う Try cn.Open() rs.Open(_ConnectionString, cn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockReadOnly) _RecordCount = rs.RecordCount _ColumnCount = rs.Fields.Count _DataTable = New String(_RecordCount - 1, _ColumnCount - 1) {} i = 0 Do Until rs.EOF For j = 0 To _ColumnCount - 1 _DataTable(i, j) = CType(rs.Fields(j).Value, String) Next rs.MoveNext() i = i + 1 Loop rs.Close() cn.Close() Catch ex As Exception 'Try中のエラーのとき cnとrsのopen、データ取り込み時それぞれで節を分ければError位置が特定できる。はず。 Debug.Print("ERROR:" & TypeName(Me) & ":DB or RS Open failed”) OnOK = False End Try Return OnOK End Function 'クローズ。ホントは必要なさそうなんだけど、OpenしたからにはCloseしたくなるのは本能。 'あと、いろいろ頑張って呼ぼうとしたけど出てきてくんないデストラクタくんを呼んでみる。なんもしてないんだけど。 Public Sub close() _DataTable = Nothing Call Class_Terminate() End Sub '---------- 'Private Function '---------- '_Item Override群 Start Overridable を書くと『Private と Overridable を組み合わせることはできません。』と怒られる。 'データ要素単体渡し。stringで返す。範囲外のINDEX渡すと怒られるぞ。 Private Function _Item(ByVal i As Integer, ByVal j As Integer) As String Return (_DataTable(i, j)) End Function 'オーバーライドを試してみる。引数が数値一つだけなら、コッチが呼ばれる。 '実動作はRecord()で。 Private Function _Item(ByVal i As Integer) As String() Return (_Record(i)) End Function '_Item Override群 End 'INDEXのRecordの要素全てを、Stringの1元配列型で返す。 Private Function _Record(ByVal i As Integer) As String() Dim ReturnTable() As String Dim j As Integer ReturnTable = New String(_ColumnCount - 1) {} For j = 0 To _ColumnCount - 1 ReturnTable(j) = _DataTable(i, j) Next j Return (ReturnTable) End Function 'INDEXのColumnの要素全てを、Stringの1元配列型で返す。 Private Function _Column(ByVal j As Integer) As String() Dim ReturnTable() As String Dim i As Integer ReturnTable = New String(_RecordCount - 1) {} For i = 0 To _RecordCount - 1 ReturnTable(i) = _DataTable(i, j) Next i Return (ReturnTable) End Function End Class
<<前
0 件のコメント:
コメントを投稿