2008-11-28 16 views
2

J'ai un TSQLDataSet qui a un champ blob, je dois obtenir les données de ce champ blob en cas BeforeUpdateRecord du fournisseur et exécuter une commande de mise à jour, je l'ai essayé:Comment puis-je exécuter une commande sql avec un param blob dans dbx?

Cmd := TSQLQuery.Create(nil); 
try 
    Cmd.SQLConnection := SQLConnection; 
    Cmd.CommandText := 'UPDATE MYTABLE SET IMAGE = :PIMAGE WHERE ID = :PID'; 
    Cmd.Params.CreateParam(ftBlob, 'PIMAGE ', ptInput).Value := DeltaDS.FieldByName('IMAGE').NewValue; //blob field 
    Cmd.Params.CreateParam(ftString, 'PID', ptInput).Value := DeltaDS.FieldByName('ID').NewValue; 
    Cmd.ExecSQL; 
finally 
    Cmd.Free; 
end; 

Quand je exécuter que j'obtiens un EDatabaseError avec le message: 'Aucune valeur pour le paramètre PIMAGE.

Qu'est-ce qui me manque?

Répondre

2

répondre à ma propre question, la bonne façon de le faire est la suivante:

const 
    SQL = 'UPDATE MYTABLE SET IMAGE = :PIMAGE WHERE ID = :PID;'; 
var 
    Params: TParams; 
begin 
    Params := TParams.Create(nil); 
    try 
    Params.CreateParam(ftBlob, 'PIMAGE', ptInput).AsBlob := DeltaDS.FieldByName('IMAGE').NewValue; 
    Params.CreateParam(ftString, 'PID', ptInput).Value := DeltaDS.FieldByName('ID').NewValue; 
    SQLConnection.Execute(SQL, Params); 
    finally 
    Params.Free; 
    end; 
end; 
0

Avez-vous essayé de tester avec un autre pilote (par exemple ODBC)? Il est possible que l'erreur ne soit pas dans votre code. Cette approche (changement des fournisseurs de données/pilotes) m'a aidé avec quelques problèmes confus qui s'est avéré ne pas être le mien.