CnADOConPool.pas 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. {******************************************************************************}
  2. { CnPack For Delphi/C++Builder }
  3. { 中国人自己的开放源码第三方开发包 }
  4. { (C)Copyright 2001-2018 CnPack 开发组 }
  5. { ------------------------------------ }
  6. { }
  7. { 本开发包是开源的自由软件,您可以遵照 CnPack 的发布协议来修 }
  8. { 改和重新发布这一程序。 }
  9. { }
  10. { 发布这一开发包的目的是希望它有用,但没有任何担保。甚至没有 }
  11. { 适合特定目的而隐含的担保。更详细的情况请参阅 CnPack 发布协议。 }
  12. { }
  13. { 您应该已经和开发包一起收到一份 CnPack 发布协议的副本。如果 }
  14. { 还没有,可访问我们的网站: }
  15. { }
  16. { 网站地址:http://www.cnpack.org }
  17. { 电子邮件:master@cnpack.org }
  18. { }
  19. {******************************************************************************}
  20. unit CnADOConPool;
  21. {* |<PRE>
  22. ================================================================================
  23. * 软件名称:不可视工具组件包
  24. * 单元名称:ADOConnection 对象池单元
  25. * 单元作者:Chinbo(Shenloqi)
  26. * 备 注:
  27. * 开发平台:PWin2000Pro + Delphi 7.0
  28. * 兼容测试:PWin9X/2000/XP + Delphi 5/6
  29. * 本 地 化:该单元中的字符串暂不符合本地化处理方式
  30. * 单元标识:$Id$
  31. * 修改记录:2004.03.18 V1.0
  32. * 创建单元
  33. * 2004.09.18 V1.1
  34. * 公开从父类继承的属性WaitTimeOut
  35. * 修改了ReleaseConnection的实现,不再强制类型转换
  36. ================================================================================
  37. |</PRE>}
  38. interface
  39. {$I CnPack.inc}
  40. {$IFDEF SUPPORT_ADO}
  41. uses
  42. Windows, Messages, SysUtils, Classes, CnObjectPool, ADODB,
  43. CnConsts, CnCompConsts;
  44. type
  45. TCnADOConWrapper = class(TCnObjectWrapper)
  46. private
  47. function GetConnection: TADOConnection;
  48. public
  49. property Connection: TADOConnection read GetConnection;
  50. end;
  51. TCnADOConPool = class(TCnCustomObjectPool)
  52. private
  53. FConnectionString: WideString;
  54. procedure SetConnectionString(const Value: WideString);
  55. protected
  56. function DoCreateOne(Wrapper: TCnObjectWrapper;
  57. var Obj: TObject): Boolean; override;
  58. function DoFreeOne(Wrapper: TCnObjectWrapper;
  59. var Obj: TObject): Boolean; override;
  60. function DoGetOne(Wrapper: TCnObjectWrapper;
  61. var Obj: TObject): Boolean; override;
  62. function DoReleaseOne(Wrapper: TCnObjectWrapper;
  63. var Obj: TObject): Boolean; override;
  64. function DoReInitOne(Wrapper: TCnObjectWrapper;
  65. var Obj: TObject): Boolean; override;
  66. procedure GetComponentInfo(var AName, Author, Email, Comment: string); override;
  67. public
  68. function GetConnection(var con: TADOConnection;
  69. const go: TCnObjectPoolGetOption = goNone): TCnObjectPoolGetResult;
  70. procedure ReleaseConnection(var con: TADOConnection;
  71. const ro: TCnObjectPoolReleaseOption = roNone);
  72. published
  73. property ConnectionString: WideString
  74. read FConnectionString
  75. write SetConnectionString;
  76. property MinSize;
  77. property MaxSize;
  78. property LowLoadCount;
  79. property PeakCount;
  80. property PolicyOnBusy;
  81. property PolicyOnPeak;
  82. property PolicyOnGet;
  83. property WaitTimeOut;
  84. property OnGetOne;
  85. property OnReleaseOne;
  86. property OnReInitOne;
  87. end;
  88. {$ENDIF SUPPORT_ADO}
  89. implementation
  90. {$IFDEF SUPPORT_ADO}
  91. uses
  92. ActiveX,
  93. ComObj;
  94. { TCnADOConWrapper }
  95. function TCnADOConWrapper.GetConnection: TADOConnection;
  96. begin
  97. Result := nil;
  98. if Assigned(ObjectWrapped) then
  99. Result := TADOConnection(ObjectWrapped);
  100. end;
  101. { TCnADOConPool }
  102. function TCnADOConPool.DoCreateOne(Wrapper: TCnObjectWrapper;
  103. var Obj: TObject): Boolean;
  104. begin
  105. csObjectMgr.Enter;
  106. try
  107. CoInitialize(nil);
  108. try
  109. Obj := TADOConnection.Create(Self);
  110. with TADOConnection(Obj) do
  111. begin
  112. KeepConnection := True;
  113. LoginPrompt := False;
  114. ConnectionString := Self.ConnectionString;
  115. end;
  116. Result := inherited DoCreateOne(Wrapper, Obj);
  117. if Assigned(Wrapper) then
  118. TCnADOConWrapper(Wrapper).NeedReInit := True;
  119. finally
  120. CoUninitialize;
  121. end;
  122. finally
  123. csObjectMgr.Leave;
  124. end;
  125. end;
  126. function TCnADOConPool.DoFreeOne(Wrapper: TCnObjectWrapper;
  127. var Obj: TObject): Boolean;
  128. begin
  129. csObjectMgr.Enter;
  130. try
  131. Result := inherited DoFreeOne(Wrapper, Obj);
  132. finally
  133. csObjectMgr.Leave;
  134. end;
  135. end;
  136. function TCnADOConPool.DoGetOne(Wrapper: TCnObjectWrapper;
  137. var Obj: TObject): Boolean;
  138. begin
  139. csObjectMgr.Enter;
  140. try
  141. Result := inherited DoGetOne(Wrapper, Obj);
  142. finally
  143. csObjectMgr.Leave;
  144. end;
  145. end;
  146. function TCnADOConPool.DoReInitOne(Wrapper: TCnObjectWrapper;
  147. var Obj: TObject): Boolean;
  148. begin
  149. Result := True;
  150. csObjectMgr.Enter;
  151. try
  152. CoInitialize(nil);
  153. try
  154. with TADOConnection(Obj) do
  155. begin
  156. Connected := False;
  157. KeepConnection := True;
  158. LoginPrompt := False;
  159. ConnectionString := Self.ConnectionString;
  160. try
  161. Connected := True;
  162. except
  163. Result := False;
  164. end;
  165. end;
  166. Result := (inherited DoReInitOne(Wrapper, Obj)) and Result;
  167. if not Result then
  168. TCnADOConWrapper(Wrapper).NeedReInit := True;
  169. finally
  170. CoUninitialize;
  171. end;
  172. finally
  173. csObjectMgr.Leave;
  174. end;
  175. end;
  176. function TCnADOConPool.DoReleaseOne(Wrapper: TCnObjectWrapper;
  177. var Obj: TObject): Boolean;
  178. begin
  179. csObjectMgr.Enter;
  180. try
  181. Result := inherited DoReleaseOne(Wrapper, Obj);
  182. finally
  183. csObjectMgr.Leave;
  184. end;
  185. end;
  186. procedure TCnADOConPool.GetComponentInfo(var AName, Author, Email,
  187. Comment: string);
  188. begin
  189. AName := SCnADOConPoolName;
  190. Author := SCnPack_Shenloqi;
  191. Email := SCnPack_ShenloqiEmail;
  192. Comment := SCnADOConPoolComment;
  193. end;
  194. function TCnADOConPool.GetConnection(var con: TADOConnection;
  195. const go: TCnObjectPoolGetOption): TCnObjectPoolGetResult;
  196. var
  197. Obj: TObject;
  198. begin
  199. Result := GetOne(Obj, go);
  200. if Obj is TADOConnection then
  201. con := TADOConnection(Obj)
  202. else
  203. begin
  204. if Obj <> nil then
  205. ReleaseOne(Obj, roFree);
  206. con := nil;
  207. Result := grGetError;
  208. end;
  209. end;
  210. procedure TCnADOConPool.ReleaseConnection(var con: TADOConnection;
  211. const ro: TCnObjectPoolReleaseOption);
  212. begin
  213. ReleaseOne(con, ro);
  214. end;
  215. procedure TCnADOConPool.SetConnectionString(const Value: WideString);
  216. begin
  217. csObjectMgr.Enter;
  218. try
  219. FConnectionString := Value;
  220. ReInitAll;
  221. finally
  222. csObjectMgr.Leave;
  223. end;
  224. end;
  225. {$ENDIF SUPPORT_ADO}
  226. end.