Dato devuelto por un procedimiento almacenado

16/11/2005 - 12:53 por Raul Marcial | Informe spam
Hola,

Tengo este procedimiento almacenado:

***************************************************************************************************

ALTER PROCEDURE [dbo].[PA_DevolverLocalizaciones]
@lon float,
@lat float
AS
declare @Localizacion as char
declare @SearchSize as decimal(18,15)
select @SearchSize = (0.0001)

select @Localizacion = (select top 1 POBLACION from LOCALIZACIONES
where LONGITUD = @lon and LATITUD = @lat)

while @Localizacion is null
begin
select @Localizacion = (select top 1 POBLACION from LOCALIZACIONES
where LONGITUD between @lon-@SearchSize and @lon+@searchSize and
LATITUD between @lat-@SearchSize and @lat+@SearchSize)
select @SearchSize = @SearchSize + 0.001
end

return @Localizacion

***********************************************************************************************

Y en el codigo tengo esto:


Dim oCommand As SqlClient.SqlCommand = New
SqlClient.SqlCommand("[PA_DevolverLocalizaciones]", Conexion)
oCommand.CommandTimeout = 0
oCommand.CommandType = CommandType.StoredProcedure
oCommand.Parameters.Add("@Localizacion",
SqlDbType.Int).Direction() = ParameterDirection.ReturnValue
oCommand.Parameters.Add("@lon", SqlDbType.Float).Value Longitud
oCommand.Parameters.Add("@lat", SqlDbType.Float).Value Latitud

Conexion.Open()
Dim ValorDevuelto As Object = oCommand.ExecuteScalar()
Conexion.Close()

-

Cuando ejecuta "oCommand.ExecuteScalar() me devuelve el error: "Syntax
error converting the varchar value 'MADRID ' to a column of data type
int"

He consultado ya varios foros y este mismo grupo, probando lo q en
estos se comentaba, pero sigo igual.

Gracias, un saludo.

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
16/11/2005 - 14:09 | Informe spam
El problema es que el valor de retorno del SP (lo que devuelve RETURN) debe
ser numerico y no un texto. Puedes resolverlo devolviendo el valor como una
fila o por medio de un parametro de salida (OUT).

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
#2 Pedro Luna Montalvo, [MVP VB.NET]
16/11/2005 - 14:54 | Informe spam
Saludos Raul,

Veo algo que vale aclarar sobre el codigo T-SQL y el codigo VB.NET que nos
muestras.

Como bien indicó Eduardo antes, la sentencia RETURN debe retornar un codigo
de estado entero; y no puede retornar un valor alfanumerico, como el caso
que mencionas. La alternativa que menciona Eduardo es valida, es decir, que
en lugar de usar RETURN, utilices un parametro de salida para recuperar ese
valor.

Pero me llama la atencion el mecanismo que utilizas para recuperar ese valor
del RETURN.
Suponiendo que la linea: return @Localizacion; recuperada un valor entero;
la forma correcta de recuperar ese valor en el codigo VB.NET seria el
siguiente:

Conexion.Open()
oCommand.ExecuteNonQuery()
Conexion.Close()

Dim ValorRetorno As Object =
oCommand.Parameters("@Localizacion").Value

Esto porque este parametro lo has configurado para recuperar el valor de
retorno: Direction = ParameterDirection.ReturnValue.



Ahora, especificamente en tu caso, una alternativa a utilizar un parametro
de salida seria que al final del procedimiento, en lugar de utilizar:
return @Localizacion
deberias de utilizar: select @Localizacion

Esto hace que se retorna una "tabla", con una fila y una columna, con el
valor que quieres recuperar, y este si lo podrias recuperar de la siguiente
forma:

Conexion.Open()
Dim ValorDevuelto As Object = oCommand.ExecuteScalar()
Conexion.Close()

Es decir, sin modificar el resto de tu codigo. Entonces, solo cambiar el
RETURN por el SELECT al final del procedimiento, y prueba tu codigo sin
modificaciones.

Ya nos avisarás como te fue :)

Saludos,
Pedro Luna, [MVP VB.NET]
Gye, Ecu


"Raul Marcial" escribió en el mensaje
news:
Hola,

Tengo este procedimiento almacenado:

***************************************************************************************************

ALTER PROCEDURE [dbo].[PA_DevolverLocalizaciones]
@lon float,
@lat float
AS
declare @Localizacion as char
declare @SearchSize as decimal(18,15)
select @SearchSize = (0.0001)

select @Localizacion = (select top 1 POBLACION from LOCALIZACIONES
where LONGITUD = @lon and LATITUD = @lat)

while @Localizacion is null
begin
select @Localizacion = (select top 1 POBLACION from LOCALIZACIONES
where LONGITUD between @ and @lon+@searchSize and
LATITUD between @ and @lat+@SearchSize)
select @SearchSize = @SearchSize + 0.001
end

return @Localizacion

***********************************************************************************************

Y en el codigo tengo esto:


Dim oCommand As SqlClient.SqlCommand = New
SqlClient.SqlCommand("[PA_DevolverLocalizaciones]", Conexion)
oCommand.CommandTimeout = 0
oCommand.CommandType = CommandType.StoredProcedure
oCommand.Parameters.Add("@Localizacion",
SqlDbType.Int).Direction() = ParameterDirection.ReturnValue
oCommand.Parameters.Add("@lon", SqlDbType.Float).Value > Longitud
oCommand.Parameters.Add("@lat", SqlDbType.Float).Value > Latitud

Conexion.Open()
Dim ValorDevuelto As Object = oCommand.ExecuteScalar()
Conexion.Close()

-

Cuando ejecuta "oCommand.ExecuteScalar() me devuelve el error: "Syntax
error converting the varchar value 'MADRID ' to a column of data type
int"

He consultado ya varios foros y este mismo grupo, probando lo q en
estos se comentaba, pero sigo igual.

Gracias, un saludo.

Respuesta Responder a este mensaje
#3 Raul Marcial
17/11/2005 - 15:37 | Informe spam
Gracias por las respuestas, lo he solucionado cambiando el return por
select como me decia Pedro, aunq luego lo he tenido q amoldar para
recuperar 2 campos en vez de uno, lo he dejado asi, por ahora me
funciona:

****************************************************************************************************

ALTER PROCEDURE [dbo].[PA_DevolverLocalizaciones]
@lon float,
@lat float,
@Poblacion char(50) OUTPUT,
@Provincia char(50) OUT
AS
declare @SearchSize as decimal(18,15)
select @SearchSize = (0.0001)

select @Poblacion = (select top 1 rtrim(POBLACION) from LOCALIZACIONES
where LONGITUD = @lon and LATITUD = @lat)
select @Provincia = (select top 1 rtrim(PROVINCIA) from LOCALIZACIONES
where LONGITUD = @lon and LATITUD = @lat)

while @Poblacion is null

begin
select @Poblacion = (select top 1 rtrim(POBLACION) from LOCALIZACIONES
where LONGITUD between @ and @lon+@searchSize and
LATITUD between @ and @lat+@SearchSize)
select @Provincia = (select top 1 rtrim(PROVINCIA) from LOCALIZACIONES
where LONGITUD between @ and @lon+@searchSize and
LATITUD between @ and @lat+@SearchSize)
select @SearchSize = @SearchSize + 0.001
end

****************************************************************************************************

y el codigo:


Dim oCommand As SqlClient.SqlCommand = New
SqlClient.SqlCommand("[PA_DevolverLocalizaciones]", Conexion)
oCommand.CommandTimeout = 0
oCommand.CommandType = CommandType.StoredProcedure
oCommand.Parameters.Add("@Poblacion", SqlDbType.Char,
50).Direction() = ParameterDirection.Output
oCommand.Parameters.Add("@Provincia", SqlDbType.Char,
50).Direction() = ParameterDirection.Output
oCommand.Parameters.Add("@lon", SqlDbType.Float).Value Longitud
oCommand.Parameters.Add("@lat", SqlDbType.Float).Value Latitud

Conexion.Open()
oCommand.ExecuteNonQuery()
'MsgBox(oCommand.Parameters("@Poblacion").Value)
'MsgBox(oCommand.Parameters("@Provincia").Value)
Conexion.Close()


Un saludo.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida