SQL : pb avec insert

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 27 août 2008 à 09:12
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 27 août 2008 à 16:37
Bonjour,

Pour faire suite à la discussion Fieldbyname non déclaréavec Jenojen, nous rencontrons un problème des plus agaçants :

Sur une table avec un champ Integer, il est impossible de faire un insert. A chaque fois delphi retourne un message 'Conversion de type variant incorrect'.

Exemple :
Var
   LI_Truc : Integer;
begin
    LI_Truc := MaTable2ChampEntier.AsInteger;
    With TQuery.Create(nil) do begin
         DatabaseName := [le rep contenant le fichier];
         SQL.Add('Insert into MaTable (MonChampEntier)');
         SQL.Add('Values ('+ IntToStr(LI_Truc) +')');
         ExecSQL;
         Free;
    end;
end;
Ça, ça ne marche pas (sauf si MonChampEntier est en réel, mais cette solution ne me convient qu'à moitié)

En revanche :
Var
   LI_Truc : Integer;
begin

    LI_Truc := MaTable2ChampEntier.AsInteger;

    With TQuery.Create(nil) do begin

         DatabaseName := [le rep contenant le fichier];

         SQL.Add('Insert into MaTable (MonChampEntier)');

         SQL.Add('Select distinct MonChampEntier');
         SQL.Add('From MaTable2');
         SQL.Add('Where MonChampEntier = '+ IntToStr(LI_Truc));

         ExecSQL;

         Free;

    end;

end;
Ce code fonctionne sans problème.
Quelques idées la dessus ?
Pour info, je rencontre ce problème sur D5 et des tables paradox

Simon

2 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 août 2008 à 15:39
Bonjour,

A chaud :
les deux exemples sont très differents..
l'un est une insertion directe et l'autre une insertion à l'aide d'une sous-requête.
On ne peut donc pas les comparer..
la 2e solution ne présente pas d'intérêt puisque la valeur de  LI_Truc est connu au départ.

Pour le premier, il faudrait plus d'infos, car la structure de la table est importante
est ce que par exemple le champ MonChampEntier ne serait pas 
une clé primaire auto-incrémentale ?
A quoi sert également DatabaseName dans ce code ?

je vais faire des tests de mon côté..

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 août 2008 à 16:37
Un exemple sur la table employee de la DBDEMOS :

procedure TForm1.Button4Click(Sender: TObject);
var
  LI_Truc: Integer;
begin
  LI_Truc := 1000;
  with TQuery.Create(nil) do begin
    DatabaseName := 'c:\Program Files\Fichiers communs\Borland Shared\Data';
    SQL.Add('Insert into employee (EmpNo)');
    SQL.Add('Values (' + IntToStr(LI_Truc) + ')');
    ExecSQL;
    Free;
  end;
end;


Ca marche bien sûr mais une seule fois car le champ EmpNo est déclaré en "clé primaire".
 
je pense maintenant que tu devrais t'en sortir..

cantador
0
Rejoignez-nous