PDA

Ver la Versión Completa : ejecutar Procedimiento almacenado en SQL Server, Intraweb.


Roilo
27-06-2007, 16:51:54
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:

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:

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:


...
WHERE Nombre like '%'+@palabra+'%'
...

Roilo
28-06-2007, 14:15:51
Parece que el error no está en el procedimiento, porque lo definí como:

CREATE PROCEDURE [dbo].[busqueda]
@palabra nvarchar
AS
SELECT Nombre,CentroTrab FROM control WHERE Nombre = @ (+@palabra+'%')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
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:

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í.

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
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
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.