¿Cómo puedo ejecutar un comando sql con un blob param en dbx?
Pregunta
Tengo un TSqlDataSet que tiene un campo de blob, necesito obtener los datos de este campo de blob en el evento BeforeUpdateRecord del proveedor y ejecutar un comando de actualización, he intentado esto:
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;
Cuando ejecuto eso, obtengo un EDatabaseError con el mensaje: 'Sin valor para el parámetro PIMAGE.
¿Qué me estoy perdiendo?
Solución
Respondiendo a mi propia pregunta, la forma correcta de hacerlo es la siguiente:
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;
Otros consejos
¿Has intentado probar con otro controlador (por ejemplo, ODBC)? Es posible que el error no esté en su código. Este enfoque (cambio de proveedores / controladores de datos) me ha ayudado con algunos problemas confusos que resultaron no ser míos.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow