2018年4月29日日曜日

Accessアクセス from VB ~Class化してみるよ~(8:今度こそ完成版)

完成版(でいいや)
.item Propertyでもデータ要素を参照できるようにした。
Default設定し、Class変数(i,j)でも参照できるようにした。
他、書式の統一化、Castの明示可などなど。
ちなみに、データを全てStringにしてるのは、Table化した際の扱いが楽なため。


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


<<前

0 件のコメント:

コメントを投稿