2018年4月26日木曜日

Accessアクセス from VB ~Class化してみるよ~(5:とりえあず完成版)

20180428追記
なんかいろいろ勘違いしてた。動くけど、メソッドにする必要がないとかいろいろできそうなので、再開発決定

---
とりあえず実用レベルまでできた。

  1. Public Class SetDBtoTable
  2. '----------
  3. 'Variable
  4. '----------
  5. Private _Provider As String
  6. Private _DataSource As String
  7. Private _ConnectionString As String
  8. Private _UserID As String
  9. Private _Password As String
  10. Private _RecordCount As Long
  11. Private _ColumnCount As Long
  12. Private _DataTable(,) As String 'テーブルデータ格納場所
  13. '----------
  14. 'Property
  15. '----------
  16. '------------------------------
  17. 'DBへアクセスするために必要なProperty群
  18. '------------------------------
  19. 'プロバイダ指定。Accessなら"Microsoft.Jet.OLEDB.4.0;"みたいなの
  20. Public Property Provider As String
  21. Get
  22. Return _Provider
  23. End Get
  24. Set(value As String)
  25. _Provider = value
  26. End Set
  27. End Property
  28. 'データソース指定。Accessならファイル名
  29. Public Property DataSource As String
  30. Get
  31. Return _DataSource
  32. End Get
  33. Set(value As String)
  34. _DataSource = value
  35. End Set
  36. End Property
  37. 'コネクションストリング。テーブル名だったりSQLだったり
  38. Public Property ConnectionString As String
  39. Get
  40. Return _ConnectionString
  41. End Get
  42. Set(value As String)
  43. _ConnectionString = value
  44. End Set
  45. End Property
  46. 'ユーザーID。テストしてないから動くかどうかわからない( ゚-゚)~゚
  47. Public Property UserID As String
  48. Get
  49. Return _UserID
  50. End Get
  51. Set(value As String)
  52. _UserID = value
  53. End Set
  54. End Property
  55. 'パスワード。テストしてな(以下略
  56. Public Property Password As String
  57. Get
  58. Return _Password
  59. End Get
  60. Set(value As String)
  61. _Password = value
  62. End Set
  63. End Property
  64. '------------------------------
  65. '得たデータを参照するProperty群
  66. '------------------------------
  67. 'レコード数
  68. Public ReadOnly Property RecordCount As Long
  69. Get
  70. Return _RecordCount
  71. End Get
  72. End Property
  73. 'カラム数
  74. Public ReadOnly Property ColumnCount As Long
  75. Get
  76. Return _ColumnCount
  77. End Get
  78. End Property
  79. 'データの2次元配列の値返し。
  80. 'てゆかPropertyじゃなくMethodにしたほがいくね?
  81. Public ReadOnly Property Value As String(,)
  82. Get
  83. Return _DataTable
  84. End Get
  85. End Property
  86. '----------
  87. 'Constructor
  88. '----------
  89. Public Sub New()
  90. Debug.Print("Constructor:" & TypeName(Me))
  91. _Provider = "Microsoft.Jet.OLEDB.4.0;"
  92. End Sub
  93. '----------
  94. 'Destructor
  95. '----------
  96. Private Sub Class_Terminate()
  97. Debug.Print("Destructor:" & TypeName(Me))
  98. End Sub
  99. '----------
  100. 'Method
  101. '----------
  102. 'DBにアクセスし、レコード数、カラム数、データ本体を読み込み、Class変数に代入
  103. Public Function Open() As Boolean
  104. Dim OnOK As Boolean = True
  105. Dim cn As ADODB.Connection
  106. Dim rs As ADODB.Recordset
  107. cn = New ADODB.Connection
  108. rs = New ADODB.Recordset
  109. Dim i As Integer
  110. Dim j As Integer
  111. cn.Provider = _Provider
  112. '_ConnectionStringが空か確認。空であればエラーを吐きFalseを返してMethod終了
  113. If _ConnectionString = Nothing Then
  114. Debug.Print("ERROR:" & TypeName(Me) & ":ConnectionString Property Not Assignment”)
  115. OnOK = False
  116. Return OnOK
  117. End If
  118. 'DataSourceが空か確認。空であればエラーを吐きFalseを返してMethod終了
  119. If _DataSource = vbNullString Then
  120. Debug.Print("ERROR:" & TypeName(Me) & ":DataSource Property Not Assignment”)
  121. OnOK = False
  122. Return OnOK
  123. End If
  124. 'DataSource設定(テーブ名やSQL。DELETEとか書かれても、rs.open()のときにReadOnlyで開くからはじけると思う
  125. cn.Properties("Data Source").Value = _DataSource
  126. 'ID/Passwd設定(試してない
  127. If _UserID <> vbEmpty Then
  128. cn.Properties("UserID").Value = _UserID
  129. End If
  130. If _Password <> Nothing Then
  131. cn.Properties("Password").Value = _Password
  132. End If
  133. Try
  134. cn.Open()
  135. rs.Open(_ConnectionString, cn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockReadOnly)
  136. _RecordCount = rs.RecordCount
  137. _ColumnCount = rs.Fields.Count
  138. _DataTable = New String(_RecordCount - 1, _ColumnCount - 1) {}
  139. i = 0
  140. Do Until rs.EOF
  141. For j = 0 To _ColumnCount - 1
  142. _DataTable(i, j) = rs.Fields(j).Value
  143. Next
  144. rs.MoveNext()
  145. i = i + 1
  146. Loop
  147. rs.Close()
  148. cn.Close()
  149. Catch ex As Exception
  150. 'Try中のエラーのとき cnとrsのopen、データ取り込み時それぞれで節を分ければError位置が特定できる。はず。
  151. Debug.Print("ERROR:" & TypeName(Me) & ":DB or RS Open failed”)
  152. OnOK = False
  153. End Try
  154. Return OnOK
  155. End Function
  156. 'クローズ。ホントは必要なさそうなんだけど、OpenしたからにはCloseしたくなるのは本能。
  157. 'あと、いろいろ頑張って呼ぼうとしたけど出てきてくんないデストラクタくんを呼んでみる。なんもしてないんだけど。
  158. Public Sub close()
  159. _DataTable = Nothing
  160. Call Class_Terminate()
  161. End Sub
  162. 'データ要素単体渡し。stringで返す。範囲外のINDEX渡すと怒られるぞ。
  163. Public Function Datas(i As Long, j As Long) As String
  164. Return (_DataTable(i, j))
  165. End Function
  166. 'オーバーライドを試してみる。引数が数値一つだけなら、コッチが呼ばれる。
  167. '実動作はRecord()で。
  168. Public Function Datas(i As Long) As String()
  169. Return (Record(i))
  170. End Function
  171. 'INDEXのRecordの要素全てを、Stringの1元配列型で返す。
  172. Public Function Record(i As Long) As String()
  173. Dim ReturnTable() As String
  174. Dim j As Long
  175. ReturnTable = New String(_ColumnCount - 1) {}
  176. For j = 0 To _ColumnCount - 1
  177. ReturnTable(j) = _DataTable(i, j)
  178. Next j
  179. Return (ReturnTable)
  180. End Function
  181. 'INDEXのColumnの要素全てを、Stringの1元配列型で返す。
  182. Public Function Column(j As Long) As String()
  183. Dim ReturnTable() As String
  184. Dim i As Long
  185. ReturnTable = New String(_RecordCount - 1) {}
  186. For i = 0 To _RecordCount - 1
  187. ReturnTable(i) = _DataTable(i, j)
  188. Next i
  189. Return (ReturnTable)
  190. End Function
  191. End Class

<<前  次>>

0 件のコメント:

コメントを投稿