sqldbtoolsunit.pas 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. unit SQLDBToolsUnit;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, toolsunit,
  6. db,
  7. sqldb, ibconnection, mysql40conn, mysql41conn, mysql50conn, pqconnection,odbcconn,oracleconnection;
  8. const SQLDBdbTypes = [mysql40,mysql41,mysql50,postgresql,interbase,odbc,oracle];
  9. MySQLdbTypes = [mysql40,mysql41,mysql50];
  10. type
  11. { TSQLDBConnector }
  12. TSQLDBConnector = class(TDBConnector)
  13. FConnection : TSQLConnection;
  14. FTransaction : TSQLTransaction;
  15. FQuery : TSQLQuery;
  16. private
  17. procedure CreateFConnection;
  18. procedure CreateFTransaction;
  19. Function CreateQuery : TSQLQuery;
  20. protected
  21. Procedure FreeNDataset(var ds : TDataset); override;
  22. Function CreateNDataset(n : integer) : TDataset; override;
  23. public
  24. destructor Destroy; override;
  25. constructor Create;
  26. property Connection : TSQLConnection read FConnection;
  27. property Transaction : TSQLTransaction read FTransaction;
  28. property Query : TSQLQuery read FQuery;
  29. end;
  30. implementation
  31. procedure TSQLDBConnector.CreateFConnection;
  32. begin
  33. if dbtype = mysql40 then Fconnection := tMySQL40Connection.Create(nil);
  34. if dbtype = mysql41 then Fconnection := tMySQL41Connection.Create(nil);
  35. if dbtype = mysql50 then Fconnection := tMySQL50Connection.Create(nil);
  36. if dbtype = postgresql then Fconnection := tpqConnection.Create(nil);
  37. if dbtype = interbase then Fconnection := tIBConnection.Create(nil);
  38. if dbtype = odbc then Fconnection := tODBCConnection.Create(nil);
  39. if dbtype = oracle then Fconnection := TOracleConnection.Create(nil);
  40. if not assigned(Fconnection) then writeln('Invalid database-type, check if a valid database-type was provided in the file ''database.ini''');
  41. with Fconnection do
  42. begin
  43. DatabaseName := dbname;
  44. UserName := dbuser;
  45. Password := dbpassword;
  46. HostName := dbhostname;
  47. open;
  48. end;
  49. end;
  50. { TSQLDBConnector }
  51. procedure TSQLDBConnector.CreateFTransaction;
  52. begin
  53. Ftransaction := tsqltransaction.create(nil);
  54. with Ftransaction do
  55. database := Fconnection;
  56. end;
  57. Function TSQLDBConnector.CreateQuery : TSQLQuery;
  58. begin
  59. Result := TSQLQuery.create(nil);
  60. with Result do
  61. begin
  62. database := Fconnection;
  63. transaction := Ftransaction;
  64. end;
  65. end;
  66. destructor TSQLDBConnector.Destroy;
  67. begin
  68. try
  69. if Ftransaction.Active then Ftransaction.Rollback;
  70. Ftransaction.StartTransaction;
  71. Fconnection.ExecuteDirect('DROP TABLE FPDEV');
  72. Ftransaction.Commit;
  73. Except
  74. if Ftransaction.Active then Ftransaction.Rollback
  75. end;
  76. try
  77. if Ftransaction.Active then Ftransaction.Rollback;
  78. Ftransaction.StartTransaction;
  79. Fconnection.ExecuteDirect('DROP TABLE FPDEV2');
  80. Ftransaction.Commit;
  81. Except
  82. if Ftransaction.Active then Ftransaction.Rollback
  83. end;
  84. FreeAndNil(FQuery);
  85. FreeAndNil(FTransaction);
  86. FreeAndNil(FConnection);
  87. inherited Destroy;
  88. end;
  89. constructor TSQLDBConnector.Create;
  90. var countID : integer;
  91. begin
  92. CreateFConnection;
  93. CreateFTransaction;
  94. FQuery := CreateQuery;
  95. FConnection.Transaction := FTransaction;
  96. try
  97. Ftransaction.StartTransaction;
  98. Fconnection.ExecuteDirect('create table FPDEV ( ' +
  99. ' ID INT NOT NULL, ' +
  100. ' NAME VARCHAR(50) ' +
  101. ') ');
  102. FTransaction.CommitRetaining;
  103. for countID := 1 to 35 do
  104. Fconnection.ExecuteDirect('insert into FPDEV (ID,NAME)' +
  105. 'values ('+inttostr(countID)+',''TestName'+inttostr(countID)+''')');
  106. Ftransaction.Commit;
  107. except
  108. if Ftransaction.Active then Ftransaction.Rollback
  109. end;
  110. end;
  111. function TSQLDBConnector.CreateNDataset(n: integer): TDataset;
  112. begin
  113. result := CreateQuery;
  114. with result as TSQLQuery do
  115. begin
  116. sql.clear;
  117. sql.add('SELECT ID,NAME FROM FPDEV WHERE ID<'+inttostr(n+1));
  118. end;
  119. end;
  120. procedure TSQLDBConnector.FreeNDataset(var ds: TDataset);
  121. begin
  122. if ds.active then ds.Close;
  123. FreeAndNil(ds);
  124. end;
  125. end.