sqldbtoolsunit.pas 3.9 KB

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