Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   ejecutar Procedimiento almacenado en SQL Server, Intraweb. (https://www.clubdelphi.com/foros/showthread.php?t=45257)

Roilo 27-06-2007 16:51:54

ejecutar Procedimiento almacenado en SQL Server, Intraweb.
 
Un abraso al FORO.
Quisiera que le hecharan un vistaso a cómo quiero ejecutar un procedimiento almacenado en SQL Server desde una aplicación IntraWeb:
Para ello uso los componentes de dbExpress.

El procedimiento es para buscar todos los nombres que tengan incluido la cadena @palabra:
Código SQL [-]
CREATE PROCEDURE [dbo].[busqueda] 
@palabra nvarchar
AS
SELECT Nombre,CentroTrab FROM control WHERE Nombre like '%@palabra%'
GO

En el Delphi selecciono el componente SQLStoredProc:
propiedades:
SQLConnection=SQLConnection1
StoredProcName=busqueda
Params : defino el parámetro @palabra

Para ejecutarlo al hacer clic en un boton:
Código Delphi [-]
procedure TFInsertar.buscarClick(Sender: TObject);
begin
 SQLStordProc1.ParamByName('@palabra').asstring := IWEdit1.Caption ; 
 ConsolaDatos.busqueda.ExecProc ;
end;

Bueno: el problema es que me da el error :
..."List Index Out of bounds(0)"

Si alguien sabe de lo que hablo y sabe qué ne falta por configurar, le agradecería la ayuda.
Gracias de antemanos.

ContraVeneno 28-06-2007 00:03:41

Creo mas bien, que el problema esta desde el procedimiento.

¿ya trataste de ejecutarlo desde el analizador de consultas?
¿Funciona?

Te pregunto esto porque a mi no me funciona de esa manera.
Al utilizar el comando like '%@palabra%'
el procedimiento buscar todo slos que coincidan con "@palabra" no con el valor del parámetro.

Tendrías que definir tu procedimiento como:

Código SQL [-]
...
WHERE Nombre like '%'+@palabra+'%'
...

Roilo 28-06-2007 14:15:51

Parece que no...
 
Parece que el error no está en el procedimiento, porque lo definí como:
Código SQL [-]
CREATE PROCEDURE [dbo].[busqueda] 
@palabra nvarchar
AS
SELECT Nombre,CentroTrab FROM control WHERE Nombre = @palabra
GO
...y nada. Me sigue el error.
Incluso, le asigné un valor predefinido al parámetro: es decir, en la propiedad Value del parámetro @palabra del objeto TSQLStoredProc le asigné una cadena y cuando le doy active=true en la propiedad del propio componente me suelta el "List index out of bounds(0)".
además...hay otro detalle que encuentro raro: a penas le asigno la conección al componente TSQLStoredProc me debería desplegar en StoredProcName todos los procedimientos almacenados que tiene el servidor en esa bd, como lo hace ADO, y apenas se seleccione un SP el propio Delphi define los parámetros...
Bueno, mientras sigo por acá...
GRACIAS de antemanos.

ContraVeneno 28-06-2007 15:45:07

¿ya lo probaste desde el query analizer ?

Roilo 28-06-2007 17:29:13

No!!!
 
si me pides que lo pruebe con el Query analizer para chequear si el SP está correcto, pierde cuidado que lo está. Lo probé con los componentes de ADO y me funcionó... aunque tube que sustituir la sentencia ExecProc por close - open.:confused:
Por otro lado me dirigí a la ayuda de Delphi y entendí que no todos los componentes para SP te devuelven la lista de procedimientos almacenados en el Server, por eso hay que especificar el nombre manualmente.
Bueno, Sigo con duda.
Gracias.

ContraVeneno 28-06-2007 18:21:38

vamos a ver, ahora si me tengo que declarar falto de conocimientos porque a mi también me estuvo marcando ese error. En fin, esto es lo que tuve que hacer, cosa que me parece extraña ya que repito varias instrucciones. Pero bueno, así es como me funciona:
Código Delphi [-]
 with datamod1.UnStoredProcedure do begin
  if active then close;
  Prepare;
  ParamByName('@Palabra').AsString:= edtBuscar.Text;
  Prepare;
  ExecProc;
  Open;
  ............
  Close;
  UnPrepare;
 end; //with


Si no pongo el "Prepare" antes de darle valor al parámetro, me marca el error de "out fo bounds". Lo que me parece raro es que tengo que utilizar el prepare antes y después del parámetro, también tengo que utilice ExecProc y Open, ya que si no lo hago así, pues no funciona.

Ojala y alguien que ya alla utilizado este componente TStoredProc pueda ilustrarnos.

Roilo 28-06-2007 19:16:39

?
 
Probaste eso sobre una aplicación IntraWeb ?
Porque esa propiedad Prepare no existe(no está declarada).
Probé con prepared := true y sigue el error del que hablamos, sigue diciendo que "El índice de la lista está fuera de los límites" ... creo que se traduce así.
Código Delphi [-]
with ConsolaDatos.busqueda do
  begin
   if Active then Close ;
   Prepared := true ;
   ParamByName('@palabra').AsString := IWEditbuscar.text ;
   Prepared := true ;
   ExecProc ;
   Open ;
   Prepared := false ;
 end ; //with
Bueno. Yo sigo por acá hasta dar con la solución (Sino :eek: ).
Mientras, si alguno de ustedes tiene algo, lo tiran para acá.
Gracias.

luisch 19-07-2007 00:01:25

hola
 
solucionaste el problema? bueno a mi me parece q estas haciendo mal el procedimiento almacenado en sql server.

javim 25-07-2007 14:29:10

Hola Roilo.
No sé como funcionan estas cosas con SQLServer, pero con Oracle tuvimos el mismo problema y era porque no le especificábamos en la propiedad "SchemaName" del SQLStoredProc el usuario propietario del procedimiento en la BD, que no coincidía con el usuario de la conexión delphi.

Seguimos sin entender porqué el mensaje de error era tan poco descriptivo como "index out of bounds" :confused:

Espero que te sirva de ayuda. Un saludo.

luisch 25-07-2007 18:01:32

proba asi:
 
Hace el procedimiento almacenado en sqlserver

CREATE PROCEDURE [busqueda]
@palabra varchar(20)
AS
select Nombre,CentroTrab
from control where (Nombre like '%'+@palabra+'%')

me imagino q sabes para que sirve el like con los comodines %...

si usas una grilla, un dataset, adoconnection y el adostoreproc haces asi:
AdoConnection conectado con la base de datos tuya;
AdoStoreProc conectado con el AdoConnection y seleccionas el procedimiento almacenado y fijate en la propiedad parametres si esta el @codigo el q aparece primero borralo.
luego el datasource conectado con el AdoStoreProc y por ultimo la grilla conectada con el datasource. una ves hecha la coneccion en el boton de buscar pones esto

procedure busqueda ......
begin
AdoStoreProc.Parameters.ParamByName('@codigo').Value := Edit1.Text;
AdoStoreProc.ExecProc;
AdoStoreProc.Active := False;
AdoStoreProc.Active := True;
end;

asi tiene que funcionar perfectamente la busqueda cualquier cosa pregunta.


La franja horaria es GMT +2. Ahora son las 18:25:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi