なんかいろいろ勘違いしてた。動くけど、メソッドにする必要がないとかいろいろできそうなので、再開発決定
---
とりあえず実用レベルまでできた。
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 Long Private _ColumnCount As Long 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 'データの2次元配列の値返し。 'てゆかPropertyじゃなくMethodにしたほがいくね? Public ReadOnly Property Value As String(,) Get Return _DataTable 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 = vbNullString Then Debug.Print("ERROR:" & TypeName(Me) & ":DataSource Property Not Assignment”) OnOK = False Return OnOK End If 'DataSource設定(テーブ名やSQL。DELETEとか書かれても、rs.open()のときにReadOnlyで開くからはじけると思う cn.Properties("Data Source").Value = _DataSource 'ID/Passwd設定(試してない If _UserID <> vbEmpty Then cn.Properties("UserID").Value = _UserID End If If _Password <> Nothing Then cn.Properties("Password").Value = _Password End If 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) = rs.Fields(j).Value 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 'データ要素単体渡し。stringで返す。範囲外のINDEX渡すと怒られるぞ。 Public Function Datas(i As Long, j As Long) As String Return (_DataTable(i, j)) End Function 'オーバーライドを試してみる。引数が数値一つだけなら、コッチが呼ばれる。 '実動作はRecord()で。 Public Function Datas(i As Long) As String() Return (Record(i)) End Function 'INDEXのRecordの要素全てを、Stringの1元配列型で返す。 Public Function Record(i As Long) As String() Dim ReturnTable() As String Dim j As Long 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元配列型で返す。 Public Function Column(j As Long) As String() Dim ReturnTable() As String Dim i As Long 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 件のコメント:
コメントを投稿