2012-01-16 13 views
8

que soy muy nuevo en Delphi y recibió el siguiente fragmento de código (de izquierda a cabo algunas partes irrelevantes) para los que estoy tratando de entender lo que hace:¿Qué sucede si llamo a ParamByName para un parámetro que no existe?

object SelectCosts: TIBQuery 
    SQL.Strings = (
     'SELECT * FROM costs ' 
     'WHERE code = :code') 
    ParamData = < 
     item 
     DataType = ftUnknown 
     Name = 'code' 
     ParamType = ptUnknown 
     end> 
    end 

En otro archivo, se utiliza esa consulta , pero se agrega un parámetro que no está definido en la consulta.

DM_HRV.SelectCosts.ParamByName('part').Value := 1; 

¿Este parámetro 'part' cambiar nada de la selección realizada? En otras palabras: ¿la consulta SQL cambia automáticamente a la siguiente?

'SELECT * FROM costs ' 
    'WHERE code = :code' 
    'AND part = :part' 
+2

Recomiendo encarecidamente establecer el SQL dinámicamente, configurarlo en el componente es propenso a muchos errores futuros. – ComputerSaysNo

+0

@DorinDuminica no es mi propio código, pero necesito revisarlo para ver qué hace. Gracias por la información, ¡podría ser útil en el futuro! – Maza89

+1

@DorinDuminica: ¡No lo he notado hasta ahora! Sin embargo, me doy cuenta de que todavía puedo encontrarlos en el futuro. En vista de eso, sería muy interesante escuchar incluso algunos de los 'muchos' posibles errores de los que está hablando. –

Respuesta

8

Eso significa que la instrucción SQL puede cambiarse en tiempo de ejecución. por lo tanto, cuando se utiliza esa consulta, el SQL ya contiene AND part = :part.

Si la instrucción SQL no contiene este parámetro adicional part, se generará una excepción al asignar ParamByName('part').Value := 1.

Supongo que no ha confundido la referencia SelectCosts (que está en DM_HRV y no en otra DM).

+1

O, aunque es menos probable, la consulta podría cambiarse en un lugar completamente diferente, nunca se sabe. –

+0

@kobik Gracias, exactamente lo que pensaba. @AndriyM Aunque parecía menos probable para usted, descubrí que sí fue cambiado en un lugar completamente diferente. El texto de la consulta fue reemplazado con 'SELECT * FROM costs WHERE code =: code AND part =: part AND year =: year'' – Maza89

+0

@ Maza89: ¡Bien hecho descifrándolo! –

0

La adición de un nuevo parámetro no cambia la consulta. Tienes que hacer eso tú mismo.

4

la instrucción que sigue en su puesto no añade un parámetro, que establece su valor:

DM_HRV.SelectCosts.ParamByName('part').Value := 1; 

Para añadir un parámetro en tiempo de ejecución, utilice CreateParam de la siguiente manera:

if DM_HRV.SelectCosts.Params.FindParam('Part') = nil then 
    DM_HRV.SelectCosts.Params.createParam(ftString, 'Part', ptInput); 

La consulta doesn no se modifique automáticamente, tienes que hacerlo tú mismo.

En su primer recorte, el ParamType y el InputType no están definidos, puede cambiar eso en el IDE accediendo al editor de propiedades de la lista de parámetros (Params) y actualizando esos valores.

Cuestiones relacionadas