ADOTIER.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // Copyright (C) 1992-1998 Microsoft Corporation
  2. // All rights reserved.
  3. //
  4. // This source code is only intended as a supplement to the
  5. // Microsoft Visual C++ Language  Reference and related
  6. // electronic documentation provided with Microsoft Visual C++.
  7. // See these sources for detailed information regarding the
  8. // Microsoft Visual C++ product.
  9. // ADOTier.cpp : Implementation of CADOSampApp and DLL registration.
  10. #include "stdafx.h"
  11. #include "ADOTier.h"
  12. /////////////////////////////////////////////////////////////////////////////
  13. //
  14. // Need two distinct "empty" VARIANTs for Command::Execute
  15. static VARIANT* pvtEmpty = static_cast<VARIANT*> (&vtMissing);
  16. static _variant_t vtMissing2(DISP_E_PARAMNOTFOUND, VT_ERROR);
  17. static VARIANT* pvtEmpty2 = static_cast<VARIANT*> (&vtMissing2);
  18. STDMETHODIMP CADOTier::InterfaceSupportsErrorInfo(REFIID riid)
  19. {
  20. static const IID* arr[] =
  21. {
  22. &IID_IADOTier,
  23. };
  24. for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
  25. {
  26. if (InlineIsEqualGUID(*arr[i],riid))
  27. return S_OK;
  28. }
  29. return S_FALSE;
  30. }
  31. STDMETHODIMP CADOTier::Open(BSTR source, BSTR user, BSTR pwd)
  32. {
  33. HRESULT hr = m_connection.CreateInstance("ADODB.Connection.1");
  34. if (SUCCEEDED(hr))
  35. hr = m_connection->Open(source, user, pwd);
  36. if (SUCCEEDED(hr))
  37. hr = m_command.CreateInstance(__uuidof(Command));
  38. if (SUCCEEDED(hr))
  39. hr = m_command->putref_ActiveConnection(m_connection);
  40. if (SUCCEEDED(hr))
  41. hr = m_recordset.CreateInstance(__uuidof(Recordset));
  42. return hr;
  43. }
  44. STDMETHODIMP CADOTier::OpenRecordset(VARIANT query)
  45. {
  46. VARIANT v;
  47. V_VT(&v) = VT_DISPATCH;
  48. V_DISPATCH(&v) = (IDispatch*) m_connection;
  49. // Need the AddRef() as VariantClear() calls Release(), unless fAddRef
  50. // false indicates we're taking ownership
  51. //
  52. V_DISPATCH(&v)->AddRef();
  53. return m_recordset->Open(query, v, adOpenDynamic, adLockOptimistic, adCmdText);
  54. }
  55. STDMETHODIMP CADOTier::CloseRecordset()
  56. {
  57. return m_recordset->Close();
  58. }
  59. STDMETHODIMP CADOTier::ExecuteConnection(BSTR query, VARIANT_BOOL bChangeRec)
  60. {
  61. _Recordset* prec = 0;
  62. HRESULT hr = m_connection->Execute(query, pvtEmpty, adCmdText, &prec);
  63. if (SUCCEEDED(hr))
  64. {
  65. if (bChangeRec)
  66. m_recordset = prec;
  67. else
  68. prec->Release();
  69. }
  70. return hr;
  71. }
  72. STDMETHODIMP CADOTier::ExecuteCommand(VARIANT_BOOL bStoredProcedure, VARIANT_BOOL bChangeRec)
  73. {
  74. _Recordset* prec = 0;
  75. HRESULT hr;
  76. if (bStoredProcedure)
  77. hr = m_command->Execute(pvtEmpty, pvtEmpty2, adCmdStoredProc, &prec);
  78. else
  79. hr = m_command->Execute(pvtEmpty, pvtEmpty2, adCmdText, &prec);
  80. if (SUCCEEDED(hr))
  81. {
  82. if (bChangeRec)
  83. m_recordset = prec;
  84. else
  85. prec->Release();
  86. }
  87. return hr;
  88. }
  89. STDMETHODIMP CADOTier::get_CommandText(BSTR * newVal)
  90. {
  91. return m_command->get_CommandText(newVal);
  92. }
  93. STDMETHODIMP CADOTier::put_CommandText(BSTR newVal)
  94. {
  95. return m_command->put_CommandText(newVal);
  96. }
  97. STDMETHODIMP CADOTier::AppendParameter(enum DataTypeEnum type, VARIANT value, enum ParameterDirectionEnum where, long size)
  98. {
  99. _ParameterPtr param;
  100. HRESULT hr = param.CreateInstance(__uuidof(Parameter));
  101. if (SUCCEEDED(hr))
  102. hr = param->put_Type(type);
  103. if (SUCCEEDED(hr))
  104. hr = param->put_Value(value);
  105. if (SUCCEEDED(hr))
  106. hr = param->put_Direction(where);
  107. if (SUCCEEDED(hr))
  108. hr = param->put_Size(size);
  109. Parameters* params = 0;
  110. if (SUCCEEDED(hr))
  111. hr = m_command->get_Parameters(&params);
  112. if (SUCCEEDED(hr))
  113. hr = params->Append(param);
  114. if (SUCCEEDED(hr))
  115. {
  116. params->Release();
  117. param->Release();
  118. }
  119. return hr;
  120. }
  121. STDMETHODIMP CADOTier::Update()
  122. {
  123. return m_recordset->Update();
  124. }
  125. STDMETHODIMP CADOTier::Delete()
  126. {
  127. return m_recordset->Delete(adAffectCurrent);
  128. }
  129. STDMETHODIMP CADOTier::get_Field(VARIANT idx, VARIANT * newVal)
  130. {
  131. Fields* fields = 0;
  132. HRESULT hr = m_recordset->get_Fields(&fields);
  133. Field* field = 0;
  134. if (SUCCEEDED(hr))
  135. hr = fields->get_Item(idx, &field);
  136. if (SUCCEEDED(hr))
  137. hr = field->get_Value(newVal);
  138. if (SUCCEEDED(hr))
  139. {
  140. fields->Release();
  141. field->Release();
  142. }
  143. return hr;
  144. }
  145. STDMETHODIMP CADOTier::put_Field(VARIANT idx, VARIANT newVal)
  146. {
  147. Fields* fields = 0;
  148. HRESULT hr = m_recordset->get_Fields(&fields);
  149. Field* field = 0;
  150. if (SUCCEEDED(hr))
  151. hr = fields->get_Item(idx, &field);
  152. if (SUCCEEDED(hr))
  153. hr = field->put_Value(newVal);
  154. if (SUCCEEDED(hr))
  155. {
  156. fields->Release();
  157. field->Release();
  158. }
  159. return hr;
  160. }
  161. STDMETHODIMP CADOTier::get_FieldCount(long * newVal)
  162. {
  163. Fields* fields = 0;
  164. HRESULT hr = m_recordset->get_Fields(&fields);
  165. if (SUCCEEDED(hr))
  166. hr = fields->get_Count(newVal);
  167. if (SUCCEEDED(hr))
  168. fields->Release();
  169. return hr;
  170. }
  171. STDMETHODIMP CADOTier::Close()
  172. {
  173. return m_connection->Close();
  174. }
  175. STDMETHODIMP CADOTier::First()
  176. {
  177. return m_recordset->MoveFirst();
  178. }
  179. STDMETHODIMP CADOTier::Next()
  180. {
  181. return m_recordset->MoveNext();
  182. }
  183. STDMETHODIMP CADOTier::Last()
  184. {
  185. return m_recordset->MoveLast();
  186. }
  187. STDMETHODIMP CADOTier::Prev()
  188. {
  189. return m_recordset->MovePrevious();
  190. }
  191. STDMETHODIMP CADOTier::get_EOF(VARIANT_BOOL * newVal)
  192. {
  193. return m_recordset->get_EOF(newVal);
  194. }
  195. STDMETHODIMP CADOTier::get_BOF(VARIANT_BOOL * newVal)
  196. {
  197. return m_recordset->get_BOF(newVal);
  198. }
  199. STDMETHODIMP CADOTier::ParamQuery(BSTR query, long idx1, BSTR idx2, BSTR idx3)
  200. {
  201. HRESULT hr = ChangeParameter(0, adInteger, (_variant_t) idx1, adParamInput, -1);
  202. if (SUCCEEDED(hr))
  203. hr = ChangeParameter(1, adVarChar, (_variant_t) idx2, adParamInput, 25);
  204. if (SUCCEEDED(hr))
  205. hr = ChangeParameter(2, adVarChar, (_variant_t) idx3, adParamInput, 80);
  206. if (SUCCEEDED(hr))
  207. hr = m_command->put_CommandText(query);
  208. _Recordset* prec = 0;
  209. if (SUCCEEDED(hr))
  210. hr = m_command->Execute(pvtEmpty, pvtEmpty2, adCmdText, &prec);
  211. if (SUCCEEDED(hr))
  212. prec->Release();
  213. return hr;
  214. }
  215. STDMETHODIMP CADOTier::CallStoredProc(long idx1, BSTR idx2, BSTR idx3)
  216. {
  217. HRESULT hr = ChangeParameter(0, adInteger, (_variant_t) idx1, adParamInput, 4);
  218. if (SUCCEEDED(hr))
  219. hr = ChangeParameter(1, adVarChar, (_variant_t) idx2, adParamInput, 25);
  220. if (SUCCEEDED(hr))
  221. hr = ChangeParameter(2, adVarChar, (_variant_t) idx3, adParamInput, 80);
  222. if (SUCCEEDED(hr))
  223. hr = m_command->put_CommandText(L"{call MyProc (?, ?, ?)}");
  224. _Recordset* prec = 0;
  225. if (SUCCEEDED(hr))
  226. hr = m_command->Execute(pvtEmpty, pvtEmpty2, adCmdText, &prec);
  227. if (SUCCEEDED(hr))
  228. prec->Release();
  229. return hr;
  230. }
  231. STDMETHODIMP CADOTier::put_StoredProc(BSTR newVal)
  232. {
  233. if (newVal == NULL)
  234. newVal = ::SysAllocString(L"create procedure MyProc @i integer, @g varchar(25), @g varchar(80) into Guns (ID, Gun, [Gun Description]) values (@i, @g, @d) return");
  235. HRESULT hr = m_command->put_CommandText(newVal);
  236. _Recordset* prec = 0;
  237. if (SUCCEEDED(hr))
  238. hr = m_command->Execute(pvtEmpty, pvtEmpty2, adCmdText, &prec);
  239. if (SUCCEEDED(hr))
  240. prec->Release();
  241. return hr;
  242. }
  243. STDMETHODIMP CADOTier::ChangeParameter(long idx, enum DataTypeEnum type, VARIANT value, enum ParameterDirectionEnum where, long size)
  244. {
  245. Parameters* params = 0;
  246. HRESULT hr = m_command->get_Parameters(&params);
  247. _Parameter* param = 0;
  248. VARIANT v;
  249. V_VT(&v) = VT_I4;
  250. V_I4(&v) = idx;
  251. if (SUCCEEDED(hr))
  252. hr = params->get_Item(v, &param);
  253. if (SUCCEEDED(hr))
  254. hr = param->put_Type(type);
  255. if (SUCCEEDED(hr))
  256. hr = param->put_Value(value);
  257. if (SUCCEEDED(hr))
  258. hr = param->put_Direction(where);
  259. if (SUCCEEDED(hr))
  260. hr = param->put_Size(size);
  261. if (SUCCEEDED(hr))
  262. {
  263. params->Release();
  264. param->Release();
  265. }
  266. return hr;
  267. }
  268. STDMETHODIMP CADOTier::Requery()
  269. {
  270. return m_recordset->Requery();
  271. }
  272. STDMETHODIMP CADOTier::ADORelease()
  273. {
  274. m_command = 0;
  275. m_recordset = 0;
  276. m_connection = 0;
  277. return S_OK;
  278. }
  279. STDMETHODIMP CADOTier::get_Empty(VARIANT_BOOL * bEmpty)
  280. {
  281. HRESULT hr = m_recordset->get_EOF(bEmpty);
  282. if (SUCCEEDED(hr) && bEmpty)
  283. hr = m_recordset->get_BOF(bEmpty);
  284. return hr;
  285. }