If I understand right, ExecSQL works only with the command in the SQL property, it doesn't use InsertSQL.
As JP showed, if parameters are used in the SQL property and ParamCheck is true, the TSQLQuery senses this and creates these parameters automatically.
Parameters works only for the SQL property. InsertSQL, UpdateSQL and DeleteSQL doesn't use parameters at all, even if they exist.
To verify that param values are not used by InsertSQL, create a param, assign a value and perform insert:
Query.Close;
Query.Params.CreateParam(ftString, 'item_name', ptInput);
Query.ParamByName('item_name').AsString:= 'Test';
Query.InsertSQL.Text := 'INSERT INTO items(item_name) VALUES(:item_name)';
Query.Open;
Query.Insert;
Query.Post;
Query.ApplyUpdates;
TX.Commit;
No value will be inserted.
Only when the command contains the real value it will be inserted:
Query.Close;
Query.InsertSQL.Text:=Format('INSERT INTO items(item_name) VALUES(%s)',[QuotedStr('Test')]);
Query.Open; //Requires a SELECT statement.
Query.Insert;
Query.Post;
Query.ApplyUpdates;
TX.Commit;
For trivial queries TSQLQuery auto-generates the statements for InsertSQL, UpdateSQL and DeleteSQL. So often its not necessary to add anything manually except the select statement in the SQL property.