Foros del Web » Programación para mayores de 30 ;) » .NET »

No entiendo el error

Estas en el tema de No entiendo el error en el foro de .NET en Foros del Web. Hola,tengo este codigo Dim oMaxSocios As New SqlConnection oMaxSocios.ConnectionString = "Server=(local);Database=Socios;Trusted_Connection =True;" Dim oCommandSocios As New SqlCommand("Select MAX(NUMREGISTRO) as NUMREGISTRO from SOCIOS", oMaxSocios) Dim oDataMaxSocios ...
  #1 (permalink)  
Antiguo 04/01/2006, 08:27
 
Fecha de Ingreso: enero-2006
Mensajes: 263
Antigüedad: 18 años, 4 meses
Puntos: 1
No entiendo el error

Hola,tengo este codigo

Dim oMaxSocios As New SqlConnection
oMaxSocios.ConnectionString = "Server=(local);Database=Socios;Trusted_Connection =True;"
Dim oCommandSocios As New SqlCommand("Select MAX(NUMREGISTRO) as NUMREGISTRO from SOCIOS", oMaxSocios)
Dim oDataMaxSocios As SqlDataReader
oMaxSocios.Open()
oDataMaxSocios = oCommandSocios.ExecuteReader
If oDataMaxSocios.HasRows() Then
MsgBox("SI")
Else
MsgBox("NO")
End If
Lo que hago es que coga el maximo registro de un tabla y luego sumar uno, pero lo que pasa es que la bd actualmente no tiene ningun registro, y cuando pregunto HasRows me salta dentro, y me sale el Msgbox SI, es decir que sin tener ningun registro cuando pregunto si hay registros lo toma porque si hay

Espero haberme explicado bien, muchas gracias por vuestra colaboracion
  #2 (permalink)  
Antiguo 04/01/2006, 09:07
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
porque probablemente el max te devuelve un record con un cero. (que seria el valor maximo cuando no hay registros).

Si lo que requieres es solo un valor, es recomendable no utilizar un dataset (el reader) sino utilizar un parametro de tipo output en un sp.

Seria algo como :

En el SQL ....

Create procedure spGetMaxRecord
@resultado int output
AS
Set @resultado = 0
Select @resultado = MAX(NUMREGISTRO) as NUMREGISTRO from SOCIOS
Set @resultado = isnull(@resultado,0)



En el Visual Studio.
Código:
        Dim cmd As SqlCommand = New SqlCommand(spGetMaxRecord, oMaxSocios)
        cmd.Parameters.Add("@resultado", 0)
        cmd.Parameters(0).Direction = ParameterDirection.Output
        cmd.ExecuteNonQuery()

        If cmd.Parameters(0).Value = 0 Then
            MsgBox("SI")
        Else
            MsgBox("NO")
        End If
algo asi...
  #3 (permalink)  
Antiguo 04/01/2006, 09:17
Avatar de Nombela  
Fecha de Ingreso: abril-2005
Mensajes: 611
Antigüedad: 19 años, 1 mes
Puntos: 1
Normalmente lo del calculo del maximo si lo quieres hacer es con:

ExecuteScalar(): retorna un único valor; ej: una suma, un campo q tiene un valor único, etc. Sería así:
SqlCommand tu_comando=new SqlCommand("SELECT MAX edad FROM Personas",tu_conexion);
int i = tu_comando_sql.ExecuteEscalar();


Por cierto no es recomendable porque si entran varios usuarios a la vez podria dar problemas.
http://www.forosdelweb.com/showthrea...ghlight=select
__________________
:si: El hombre es el único animal que come sin tener hambre, bebe sin tener sed y habla sin tener nada que decir. :si:
  #4 (permalink)  
Antiguo 04/01/2006, 09:41
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
realmente no veo el problema... si es autonumerico no tienes porque incluirlo en el insert, y si es necesario mostrar con que id quedo el registro para el usuario, esto seria despues de haber realizado la insercion... y si lo requiere antes se le muestra en el entendido de que puede variar dependiendo del tiempo que tarde en realizar la entrada y los usuarios que esten realizando transacciones.

bueno asi lo manejo yo...

un saludo

  #5 (permalink)  
Antiguo 04/01/2006, 12:36
 
Fecha de Ingreso: enero-2006
Mensajes: 263
Antigüedad: 18 años, 4 meses
Puntos: 1
He probado a hacer lo que me dices y me da 2 errores

1º En el sql me da error en la linea
Select @resultado = MAX(NUMREGISTRO) as NUMREGISTRO from SOCIOS

2º En vb.net el spGetMaxRecord no lo reconoce

Cita:
Iniciado por Andres95
porque probablemente el max te devuelve un record con un cero. (que seria el valor maximo cuando no hay registros).

Si lo que requieres es solo un valor, es recomendable no utilizar un dataset (el reader) sino utilizar un parametro de tipo output en un sp.

Seria algo como :

En el SQL ....

Create procedure spGetMaxRecord
@resultado int output
AS
Set @resultado = 0
Select @resultado = MAX(NUMREGISTRO) as NUMREGISTRO from SOCIOS
Set @resultado = isnull(@resultado,0)



En el Visual Studio.
Código:
        Dim cmd As SqlCommand = New SqlCommand(spGetMaxRecord, oMaxSocios)
        cmd.Parameters.Add("@resultado", 0)
        cmd.Parameters(0).Direction = ParameterDirection.Output
        cmd.ExecuteNonQuery()

        If cmd.Parameters(0).Value = 0 Then
            MsgBox("SI")
        Else
            MsgBox("NO")
        End If
algo asi...
  #6 (permalink)  
Antiguo 04/01/2006, 14:06
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
solo hay que quitarle el alias al sql.

Código:
Create procedure spGetMaxRecord
@resultado int output
AS 
Set @resultado = 0
Select @resultado = MAX(NUMREGISTRO) from SOCIOS
Set @resultado = isnull(@resultado,0)
el vb te truena porque no has creado el sp .. (ya que enviaba error)

para probar que el sp este listo y funcionando correctamente puedes utilizar el Query Analizer y probar tu sp creado, de la siguiente forma.

Código:
Declare @retorno int
Execute spGetMaxRecord @retorno
print @retorno

si regresa bien la informacion entonces puede continuar con tu codigo de vb.net


Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:51.