TMyLoader Bug

Discussion of open issues, suggestions and bugs regarding MyDAC (Data Access Components for MySQL) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
siik
Posts: 10
Joined: Fri 12 Jun 2009 06:10

TMyLoader Bug

Post by siik » Thu 16 Jun 2011 09:55

Hi,

ive been trying to load a number of records with the MyLodare component.

However it doesnt seem to load everything. To demonstrate, drop a MyLoader, MyConnection, Memo, MyQuery and a button on a form and run the following code:

procedure TForm1.Button1Click(Sender: TObject);
var Row,i : Integer;
begin
MyQuery1.SQL.Clear;
MyQuery1.SQL.Add('CREATE TABLE IF NOT EXISTS `DynamicData` (`DynamicDataID` int(11) NOT NULL auto_increment,');
MyQuery1.SQL.Add('`Incident_UID` int(11) default NULL,');
MyQuery1.SQL.Add('`Description1` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data1` varchar(255) default NULL,');
MyQuery1.SQL.Add('`Description2` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data2` varchar(255) default NULL,');
MyQuery1.SQL.Add('`Description3` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data3` varchar(255) default NULL,');
MyQuery1.SQL.Add('`Description4` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data4` varchar(255) default NULL,');
MyQuery1.SQL.Add('`Description5` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data5` varchar(255) default NULL,');
MyQuery1.SQL.Add('`Description6` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data6` varchar(255) default NULL,');
MyQuery1.SQL.Add('`Description7` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data7` varchar(255) default NULL,');
MyQuery1.SQL.Add('`Description8` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data8` varchar(255) default NULL,');
MyQuery1.SQL.Add('`Description9` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data9` varchar(255) default NULL,');
MyQuery1.SQL.Add('`Description10` varchar(100) default NULL,');
MyQuery1.SQL.Add('`Data10` varchar(255) default NULL,');
MyQuery1.SQL.Add('PRIMARY KEY (`DynamicDataID`))');
MyQuery1.SQL.Add(' ENGINE=InnoDB DEFAULT CHARSET=utf8;');
MyQuery1.Execute;
MyQuery1.SQL.Clear;
MyQuery1.SQL.Add('TRUNCATE TABLE DynamicData');
MyQuery1.Execute;
MyLoader1.TableName := 'DynamicData';
MyLoader1.CreateColumns;
Row := 0;
for i := 0 to 10000 do
begin
Inc(Row);
MyLoader1.PutColumnData(1,Row,row);
MyLoader1.PutColumnData(2,Row,'Some long text to test this component');
end;
MyLoader1.Load;
Memo1.Lines.Add('Inserted: '+InttoStr(Row));
MyQuery1.SQL.Clear;
MyQuery1.SQL.Add('SELECT COUNT(*) FROM DynamicData');
MyQuery1.Open;
Memo1.Lines.Add('In Database: '+MyQuery1.Fields[0].AsString);
end;

The number of records does not equal 10000.

Please help!

using component version 5.9.0.59 if that helps, (or is fixed in recent versions)

AndreyZ

Post by AndreyZ » Thu 16 Jun 2011 14:12

Hello,

You are using the TMyLoader component incorrectly. You should use the OnPutData event handler in the following way:

Code: Select all

procedure TForm1.Button1Click(Sender: TObject); 
begin
  MyQuery1.SQL.Clear;
  MyQuery1.SQL.Add('CREATE TABLE IF NOT EXISTS `DynamicData` (`DynamicDataID` int(11) NOT NULL auto_increment,');
  MyQuery1.SQL.Add('`Incident_UID` int(11) default NULL,'); 
  MyQuery1.SQL.Add('`Description1` varchar(100) default NULL,');
  MyQuery1.SQL.Add('`Data1` varchar(255) default NULL,'); 
  MyQuery1.SQL.Add('`Description2` varchar(100) default NULL,');
  MyQuery1.SQL.Add('`Data2` varchar(255) default NULL,'); 
  MyQuery1.SQL.Add('`Description3` varchar(100) default NULL,'); 
  MyQuery1.SQL.Add('`Data3` varchar(255) default NULL,'); 
  MyQuery1.SQL.Add('`Description4` varchar(100) default NULL,');
  MyQuery1.SQL.Add('`Data4` varchar(255) default NULL,'); 
  MyQuery1.SQL.Add('`Description5` varchar(100) default NULL,'); 
  MyQuery1.SQL.Add('`Data5` varchar(255) default NULL,');
  MyQuery1.SQL.Add('`Description6` varchar(100) default NULL,'); 
  MyQuery1.SQL.Add('`Data6` varchar(255) default NULL,'); 
  MyQuery1.SQL.Add('`Description7` varchar(100) default NULL,'); 
  MyQuery1.SQL.Add('`Data7` varchar(255) default NULL,'); 
  MyQuery1.SQL.Add('`Description8` varchar(100) default NULL,'); 
  MyQuery1.SQL.Add('`Data8` varchar(255) default NULL,');
  MyQuery1.SQL.Add('`Description9` varchar(100) default NULL,');
  MyQuery1.SQL.Add('`Data9` varchar(255) default NULL,');
  MyQuery1.SQL.Add('`Description10` varchar(100) default NULL,');
  MyQuery1.SQL.Add('`Data10` varchar(255) default NULL,');
  MyQuery1.SQL.Add('PRIMARY KEY (`DynamicDataID`))'); 
  MyQuery1.SQL.Add(' ENGINE=InnoDB DEFAULT CHARSET=utf8;');
  MyQuery1.Execute;
  MyQuery1.SQL.Clear;
  MyQuery1.SQL.Add('TRUNCATE TABLE DynamicData');
  MyQuery1.Execute;
  MyLoader1.TableName := 'DynamicData';
  MyLoader1.Load;
  MyQuery1.SQL.Clear;
  MyQuery1.SQL.Add('SELECT COUNT(*) FROM DynamicData');
  MyQuery1.Open;
  Memo1.Lines.Add('In Database: '+MyQuery1.Fields[0].AsString);
end;

procedure TForm1.MyLoader1PutData(Sender: TDALoader);
const Row = 10000;
var i: Integer;
begin
  for i := 1 to Row do begin
    Sender.PutColumnData(1,i,i);
    Sender.PutColumnData(2,i,'Some long text to test this component');
  end;
  Memo1.Lines.Add('Inserted: ' + InttoStr(Row));
end;
You can also take a look at the example of the TMyLoader component using in MyDACDemo. You can find MyDACDemo in the %MyDAC_Install_Directory%\Demos directory.

Post Reply