SoloCodigo
Programación General => Delphi => Mensaje iniciado por: david.rguez en Lunes 3 de Julio de 2006, 00:19
-
Hola a todos/as:
Programo en Delphi 2005 y utilizo una BBDD SQL Server. Mi problema es a la hora de utilizar un TADOStoredProc para realizar un select sobre una tabla.
Yo preparo el parámetro y hago un open sobre el componente. Perfecto, la primera vez funciona perfectamente, los datos se muestran en el DBGrid que está enlazado. Sin embargo, si en la misma ejecución de la aplicación realizo de nuevo otra búsqueda (otra vez ese procedimiento), me da error de memoria (cada vez que se invoque al componente, lo cierra, prepara el valor del parámetro actual y lo vuelve a abrir).
No tengo el código ahora mismo aquí, pero creo recordar que las operaciones eran las siguientes (sobre el ADOStoredProc)
ADOStoredProc1.Close;
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters.ParambyName('@cliente').Value:= '00001';
ADOStoredProc1.Open;
(no sé si el código lo tenía EXACTAMENTE así pero en resumen son esas las operaciones que tengo).
¿Por qué la primera vez sí lo hace bien y a partir de la segunda da error de memoria?
Un saludo:
David R.
-
Que tipo de error te da?
Lo que puede pasar es que intenes cerrar algo que ya está cerrado y te manda el error de memoria.
Proba sacar la siguiente line, o ponerla mediante una condicion, (cerrar si está abierto)
ADOStoredProc1.Close;
-
Hola, Enko:
Me sale una excepción EAccessViolation con el mensaje: "Access Violation at address 4E3B3724 in module 'sqloledb.dll'. Read of address 00000018".
El problema me sale a partir de la 2ª búsqueda, con lo que no es problema de que cierre lo que esté cerrado (de ser así, me daría error en la primera vez, ya que cierra aunque esté cerrado (valga la redundancia). El código que tengo es
ADOStoredProc1.Prepared:= false;
ADOStoredProc1.Close;
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters.ParamByName('@tipo').Value:= 1;
ADOStoredProc1.Parameters.ParamByName('@clave').Value:= enbusca.Text;
ADOStoredProc1.Prepared:= true;
ADOStoredProc1.Open;
Como ya dije, la primera vez funciona correctamente.
Un saludo:
David R.
-
prueba de esta manera si estas utilizando sql server crea un procedimiento almacenado en sql server que contega el select que mesionas con sus parametros de entrada
luego en delphi enlaza el adoprocedure al procedimeinto en sql usando las propiedades de coneccion del adoproce.
luego cuando quieras obtener la informacion escribe el siguiente codigo
adoprocedure.close;
adoprocedure.parameters[1].value:=el valor correspondiente al parametro que tiene en el indice de la propiedad parameters del adoprocedure
asi para los demas parametros
adoprocedure.parameters[1].value:=
adoprocedure.parameters[1].value:=
luego
adoprocedure.open;
asi no tendras porblemas
si no te funsiona me avisas
-
elchay, probé lo que me dijiste y ahora el módulo de búsqueda funciona correctamente aunque se ejecute 296761316 veces ^^
Muchas gracias por la información.
Y ahora meramente por curiosidad... ¿por qué de la otra forma no funcionaba?
Un saludo:
David R.