選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

254 行
7.1KB

  1. <?xml version="1.0"?>
  2. <?component error="true" debug="false"?>
  3. <component>
  4. <registration
  5. description="WscMvc Database"
  6. progid="WscMvc.Database"
  7. version="1.00"
  8. classid="{E3F7C1A2-9B4D-4E6F-8C3A-2D5B7A9E1F04}">
  9. </registration>
  10. <public>
  11. <method name="Open">
  12. <parameter name="connectionString"/>
  13. </method>
  14. <method name="Close"/>
  15. <method name="BeginTransaction"/>
  16. <method name="CommitTransaction"/>
  17. <method name="RollbackTransaction"/>
  18. <method name="ExecuteNonQuery">
  19. <parameter name="sql"/>
  20. <parameter name="paramOrder"/>
  21. <parameter name="paramsDict"/>
  22. <parameter name="rowsAffected"/>
  23. </method>
  24. <method name="ExecuteScalar">
  25. <parameter name="sql"/>
  26. <parameter name="paramOrder"/>
  27. <parameter name="paramsDict"/>
  28. <parameter name="result"/>
  29. </method>
  30. </public>
  31. <script language="VBScript">
  32. <![CDATA[
  33. Option Explicit
  34. ' Explicit, request-scoped ADODB connection/transaction/command lifecycle -
  35. ' never cached in Session/Application (SPEC SS10). Never references ASP
  36. ' intrinsics. sql uses ADO's positional "?" placeholders; paramOrder is a
  37. ' plain comma-separated string (not an array) giving the placeholder order,
  38. ' deliberately avoiding an untested VBScript-array-through-WSC-<public>
  39. ' marshaling question for zero real benefit - paramsDict (a Scripting.
  40. ' Dictionary, the same object-parameter pattern already proven by
  41. ' ViewRenderer.wsc) supplies each named value. Parameter type/size are
  42. ' inferred from VBScript VarType()/Len() - a deliberate minimal v0.1 policy,
  43. ' not a general ORM type system (SPEC SS3 non-goal).
  44. ' ADODB type/property constants (adovbs.inc is not included in a WSC script
  45. ' block; these are ADODB's own stable, documented numeric values).
  46. Const adVarWChar = 202
  47. Const adInteger = 3
  48. Const adBigInt = 20
  49. Const adDouble = 5
  50. Const adDate = 7
  51. Const adBoolean = 11
  52. Const adParamInput = 1
  53. Dim m_conn, m_isOpen
  54. m_isOpen = False
  55. Sub Open(connectionString)
  56. Set m_conn = Nothing
  57. On Error Resume Next
  58. Set m_conn = CreateObject("ADODB.Connection")
  59. If Err.Number = 0 Then m_conn.Open connectionString
  60. If Err.Number <> 0 Then
  61. Err.Clear
  62. On Error Goto 0
  63. Set m_conn = Nothing
  64. Err.Raise vbObjectError + 101, "WscMvc.Database", "Unable to open database connection"
  65. End If
  66. On Error Goto 0
  67. m_isOpen = True
  68. End Sub
  69. ' Idempotent: safe to call even if Open was never called or Close already ran.
  70. Sub Close()
  71. If m_isOpen And Not m_conn Is Nothing Then
  72. On Error Resume Next
  73. m_conn.Close
  74. Err.Clear
  75. On Error Goto 0
  76. End If
  77. Set m_conn = Nothing
  78. m_isOpen = False
  79. End Sub
  80. Sub BeginTransaction()
  81. RequireOpen
  82. On Error Resume Next
  83. m_conn.BeginTrans
  84. If Err.Number <> 0 Then
  85. Err.Clear
  86. On Error Goto 0
  87. Err.Raise vbObjectError + 102, "WscMvc.Database", "Unable to begin transaction"
  88. End If
  89. On Error Goto 0
  90. End Sub
  91. Sub CommitTransaction()
  92. RequireOpen
  93. On Error Resume Next
  94. m_conn.CommitTrans
  95. If Err.Number <> 0 Then
  96. Err.Clear
  97. On Error Goto 0
  98. Err.Raise vbObjectError + 103, "WscMvc.Database", "Unable to commit transaction"
  99. End If
  100. On Error Goto 0
  101. End Sub
  102. Sub RollbackTransaction()
  103. RequireOpen
  104. On Error Resume Next
  105. m_conn.RollbackTrans
  106. If Err.Number <> 0 Then
  107. Err.Clear
  108. On Error Goto 0
  109. Err.Raise vbObjectError + 104, "WscMvc.Database", "Unable to roll back transaction"
  110. End If
  111. On Error Goto 0
  112. End Sub
  113. Sub ExecuteNonQuery(sql, paramOrder, paramsDict, rowsAffected)
  114. Dim cmd, affected
  115. RequireOpen
  116. Set cmd = Nothing
  117. On Error Resume Next
  118. Set cmd = BuildCommand(sql, paramOrder, paramsDict)
  119. If Err.Number <> 0 Then
  120. Err.Clear
  121. On Error Goto 0
  122. Set cmd = Nothing
  123. Err.Raise vbObjectError + 105, "WscMvc.Database", "Unable to prepare command"
  124. End If
  125. On Error Goto 0
  126. On Error Resume Next
  127. cmd.Execute affected
  128. If Err.Number <> 0 Then
  129. Err.Clear
  130. On Error Goto 0
  131. Set cmd = Nothing
  132. Err.Raise vbObjectError + 106, "WscMvc.Database", "Command execution failed"
  133. End If
  134. On Error Goto 0
  135. rowsAffected = affected
  136. Set cmd = Nothing
  137. End Sub
  138. Sub ExecuteScalar(sql, paramOrder, paramsDict, result)
  139. Dim cmd, rs
  140. RequireOpen
  141. Set cmd = Nothing
  142. On Error Resume Next
  143. Set cmd = BuildCommand(sql, paramOrder, paramsDict)
  144. If Err.Number <> 0 Then
  145. Err.Clear
  146. On Error Goto 0
  147. Set cmd = Nothing
  148. Err.Raise vbObjectError + 105, "WscMvc.Database", "Unable to prepare command"
  149. End If
  150. On Error Goto 0
  151. Set rs = Nothing
  152. On Error Resume Next
  153. Set rs = cmd.Execute()
  154. If Err.Number <> 0 Then
  155. Err.Clear
  156. On Error Goto 0
  157. Set rs = Nothing
  158. Set cmd = Nothing
  159. Err.Raise vbObjectError + 106, "WscMvc.Database", "Command execution failed"
  160. End If
  161. On Error Goto 0
  162. If rs.EOF Then
  163. result = Null
  164. Else
  165. result = rs.Fields(0).Value
  166. End If
  167. On Error Resume Next
  168. rs.Close
  169. Err.Clear
  170. On Error Goto 0
  171. Set rs = Nothing
  172. Set cmd = Nothing
  173. End Sub
  174. Sub RequireOpen()
  175. If Not m_isOpen Or m_conn Is Nothing Then
  176. Err.Raise vbObjectError + 100, "WscMvc.Database", "Database is not open"
  177. End If
  178. End Sub
  179. Function BuildCommand(sql, paramOrder, paramsDict)
  180. Dim cmd, names, i, key, value
  181. Set cmd = CreateObject("ADODB.Command")
  182. cmd.ActiveConnection = m_conn
  183. cmd.CommandText = sql
  184. cmd.CommandType = 1 ' adCmdText
  185. If Len(Trim(paramOrder)) > 0 Then
  186. names = Split(paramOrder, ",")
  187. For i = 0 To UBound(names)
  188. key = Trim(names(i))
  189. If paramsDict Is Nothing Or Not paramsDict.Exists(key) Then
  190. Err.Raise vbObjectError + 107, "WscMvc.Database", "Missing parameter value: " & key
  191. End If
  192. value = paramsDict.Item(key)
  193. cmd.Parameters.Append BuildParameter(cmd, key, value)
  194. Next
  195. End If
  196. Set BuildCommand = cmd
  197. End Function
  198. Function BuildParameter(cmd, name, value)
  199. Dim p
  200. If IsNull(value) Or IsEmpty(value) Then
  201. Set p = cmd.CreateParameter(name, adVarWChar, adParamInput, 1)
  202. p.Value = Null
  203. Else
  204. Select Case VarType(value)
  205. Case 2, 3 ' vbInteger, vbLong
  206. Set p = cmd.CreateParameter(name, adInteger, adParamInput, 0, CLng(value))
  207. Case 5, 4, 6 ' vbDouble, vbSingle, vbCurrency
  208. Set p = cmd.CreateParameter(name, adDouble, adParamInput, 0, CDbl(value))
  209. Case 7 ' vbDate
  210. Set p = cmd.CreateParameter(name, adDate, adParamInput, 0, CDate(value))
  211. Case 11 ' vbBoolean
  212. Set p = cmd.CreateParameter(name, adBoolean, adParamInput, 0, CBool(value))
  213. Case Else
  214. Dim s, sz
  215. s = CStr(value)
  216. sz = Len(s)
  217. If sz = 0 Then sz = 1
  218. Set p = cmd.CreateParameter(name, adVarWChar, adParamInput, sz, s)
  219. End Select
  220. End If
  221. Set BuildParameter = p
  222. End Function
  223. ]]>
  224. </script>
  225. </component>

Powered by TurnKey Linux.