.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 件のコメント:
コメントを投稿