¿Cómo usar ADO Query Parameters para especificar nombres de tablas y campos?

Estoy ejecutando una instrucción UPDATE en TADOQuery y estoy usando parameters para algunas cosas. Inicialmente, esto estaba funcionando bien, pero agregué otro parámetro para el nombre de la tabla y el nombre del campo, y ahora está rompiendo.

El código se ve así:

 Q.SQL.Text:= 'update :tablename set :fieldname = :newid where :fieldname = :oldid'; Q.Parameters.ParamValues['tablename']:= TableName; Q.Parameters.ParamValues['fieldname']:= FieldName; Q.Parameters.ParamValues['oldid']:= OldID; Q.Parameters.ParamValues['newid']:= NewID; 

Y el error que obtengo:

Mensaje de error

Supongo que esto es porque estoy usando este nombre de campo dos veces. Puedo superar esto usando otro nombre de campo único por segunda vez, sin embargo, todavía tengo otro error:

Mensaje de error

¿Cómo uso los parameters para especificar la tabla y el campo para actualizar?

Los parameters de consulta no están diseñados para parametrizar nombres de tabla.

Lo que puede hacer es usar marcadores de position para el / los nombre / s de la tabla en su SQL, y luego usar la function de Format para replace aquellos con el / los nombre / s de la tabla, y luego usar parameters para los otros valores como de costumbre. Esto todavía es relativamente seguro a partir de la inyección SQL (la persona malévola debería conocer los nombres exactos de las tablas, la statement SQL específica que se usa y los valores para proporcionar parameters).

 const QryText = 'update %s set :fieldname = :newid where :fieldname = :oldid'; begin Q.SQL.Text := Format(QryText, [TableName]); Q.Parameters.ParamValues['fieldname'] := FieldName; Q.Parameters.ParamValues['oldid'] := OldID; Q.Parameters.ParamValues['newid'] := NewID; ... end;