Explico sobre los campos persistentes.
Se obtienen en tiempo de diseño:
1. Agregas un ADOQuery a tu form o DataModule.
2. Configuras la conexión.
3. haces clic en la propiedad SQL y se la escribes.
4. Luego en el inspector de objetos (también puede hacerse desde el menú contextual del ADOQuery al hacer clic en él con el botón secundario) les agregas los campos persistentes. El "asistente" solito te detecta los campos disponibles, seleccionalos de la lista y los agregas.
Te van a aparecer en el inspector de objetos los campos. Luego cuando deseas invocarlos, por código, simplemente los llamas por su nombre. Por defecto Delphi les pone el nombre así:
NombreDelDataSet + NombreDelCampo
Este mismo principio se puede aplicar para los parámetros.
Como su nombre lo indica, al ser persistentes están disponibles en todo momento. A ese Query ya no se lo puede reutilizar. Un Close no va a eliminar los campos (ni parámetros) que ya tenía. Por ello yo decía que no hay que hacer esa mezcla.
De lo que he leído no me claro si realmente al ADOQuery en cuestión lo tienes en el form (lo que es definirlo en tiempo de diseño) o si efectivamente TU lo CREAS en tiempo de ejecución. Esto es una creación en runtime o tiempo de ejecución:
MiQuery := TADOQuery.Create;
MiQuery.Database := '...'; // No recuerdo bien si era así la propiedad.
MiQuery.UserName := '...';
MiQuery.Password := '...';
// Otras propiedades de interés...
MiQuery.SQL := 'SELECT ... ';
MiQuery.Open;
De lo contrario, si tu lo pones en el form o en el módulo de datos lo que estás haciendo es crearlo en tiempo de diseño.
Otra cosa es que uno puede definir la SQL en tiempo de diseño o en ejecución. Es legal poner el componente en tiempo de diseño y en tiempo de ejecución "configurarlo" para cada caso; eso nos permite reutilización. Yo aplico esta última.
Si se la hace en diseño, hay que tener recaudos al momento de abrir y cerrar la consulta. Sobre todo si uno va a reusar al componente para ejecutar varias instrucciones, ya que no siempre el Close liberará los parámetros y los campos.
Lo que puedes probar, es invocar al método Prepare después de hacer la asignación de la consulta SQL y antes pasarle los datos a los parámetros.
Ya somos varios los que tenemos curiosidad de porqué no te funciona. Tiene que andar... hay alguna metida de dedo seguro.
Saludos,