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

Duda con ExecuteNonQuery

Estas en el tema de Duda con ExecuteNonQuery en el foro de .NET en Foros del Web. Hola buenas, Tengo una funcion que me devuelve las propiedades de un cliente. A esta funcion, le paso un IDCliente y me devuelve los datos ...
  #1 (permalink)  
Antiguo 20/11/2006, 06:18
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Duda con ExecuteNonQuery

Hola buenas,
Tengo una funcion que me devuelve las propiedades de un cliente.
A esta funcion, le paso un IDCliente y me devuelve los datos de ese cliente.
Lo hago ejecutando un procedimiento almacenado, pasándole un parámetro de entrada @IdCliente y me devuelve tantos parámetros de salida como propiedades tiene el cliente.
Así, luego recojo los valores de esta forma:
Código:
[...]
miConn.Open()
miCM.ExecuteNonQuery()
miConn.Close()
Dim misDetallesCliente As New DetallesCliente
misDetallesCliente.IDCliente = CInt(miCM.Parameters("@IDCliente").Value)
misDetallesCliente.Email = CStr(miCM.Parameters("@Email").Value)
[...]
El problema que tengo es que tras cerrar la conexión, y antes de empezar a recoger los valores de los parámetros, me gustraría saber si ha encontrado el registro o no. Cómo puedo comprobar eso con un ExecuteNonQuery?
Para hacerlo con un ExecuteReader yo lo haría preguntando si ".Read" , o si ".HasRows" , algo así:
Código:
miConn.Open()
Dim dR As SqlDataReader = miCM.ExecuteReader()
If dR.Read() Then
  Dim misDetallesCliente As New DetallesCliente
  misDetallesCliente.IDCliente = dR("IDCliente")
  misDetallesCliente.Email = dR("Email")
  [...]
End If
miConn.Close()
Pero con un ExecuteNonQuery no sé como comprobar si ha devuelto algun registro o no, para así, luego, poder evitar el error de acceder a un dato que no ha sido encontrado.
Espero haberme explicado. Gracias por la ayuda que me presteis.
Saludos a todos.
__________________
..:: moNTeZIon ::..
  #2 (permalink)  
Antiguo 20/11/2006, 06:28
Avatar de SuperPinwi  
Fecha de Ingreso: septiembre-2005
Mensajes: 317
Antigüedad: 18 años, 8 meses
Puntos: 1
mmmm el ExecuteNonQuery es sólo una función q ejecuta un update, delete o insert, pero creo q con eso no lo puedes comprobar

¿xq no pruebas a almacenar en una variable el contenido de la consulta?, si sale nulo sabrás que no ha encontrado el registro.

Espero servir de ayuda. Saludines y suerte
  #3 (permalink)  
Antiguo 20/11/2006, 06:40
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
una vez también tuve esa misma duda con el excutenonquery, y no me daba resultado. Pero ahora lo he probado con una consulta "delete" que teng y si me devuelve el nº de filas afectadas.

He puesto que me saque por mensaje el nº, y cuando ha encontrado me saca 1, y cuando no, me saca 0.


Saludos

PD: he vuelto a probarlo con una consulta y si me saca bien el nº de filas afectas.

dim i as integer = cmd.executenonquery
  #4 (permalink)  
Antiguo 20/11/2006, 09:26
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
OK. Quieres decir que si en vez de esto:
Código:
miConn.Open()
miCM.ExecuteNonQuery()
miConn.Close()
Hago esto:
Código:
miConn.Open()
Dim Cuantos As Integer = miCM.ExecuteNonQuery()
miConn.Close()
Entonces puedo saber las filas devueltas preguntando a "Cuantos"?
Imagino em mi caso será uno o ninguno ya que le paso como parametro la clave principal "IDCliente"... Lo pruebo.
De todas formas, os comento como lo solucioné por el momento.
En el procedimiento almacenado le agreguié otro parámetro de salida llamado "HayFilas" y al final de ese procedimiento pongo esta línea:
Código:
SELECT @HayFilas = @@Rowcount
Luego lo primero que hago es comprobar el valor de ese parámetro y si es mayor que cero, lluego accedo al resto de parámetros.
Gracias a todos.
Saludos.
__________________
..:: moNTeZIon ::..
  #5 (permalink)  
Antiguo 20/11/2006, 09:40
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
Cita:
Iniciado por moNTeZIon Ver Mensaje
OK. Quieres decir que si en vez de esto:
Código:
miConn.Open()
miCM.ExecuteNonQuery()
miConn.Close()
Hago esto:
Código:
miConn.Open()
Dim Cuantos As Integer = miCM.ExecuteNonQuery()
miConn.Close()
Entonces puedo saber las filas devueltas preguntando a "Cuantos"?
.
sip, lo he probado con algunas consultas y me ha devuelto el nº correcto de filas afectadas.

Lo curioso es que tiempo antes lo había necesitado hacer así y no me lo devolvía, pero ahora si....


saludos
  #6 (permalink)  
Antiguo 20/11/2006, 10:18
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
No deja de ser curioso

Hola freegirl,
He probado lo que dices y nada, me pasa como te ocurria anteriormente, siempre me devuelve "-1" , encuentre o no encuentre las filas.
Lo voy a dejar como comenté, que no me parece mal tampoco.

Como opinión personal, creo que igual la cosa va por las filas afectadas.
Me refiero a que INSERT, UPDATE y DELETE realizan cambios en filas, y el ExecuteNonQuery devuelve cuantas filas han sido afectadas con esos cambios, pero si la sentencia SQL es una SELECT, en principio no hay cambios en ninguna fila... Igual va por ahí.

Venga un saludo!
__________________
..:: moNTeZIon ::..
  #7 (permalink)  
Antiguo 20/11/2006, 15:58
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 3 meses
Puntos: 50
Cita:
el ExecuteNonQuery devuelve cuantas filas han sido afectadas con esos cambios
asi es..

si quieres obtener el total pueds hacer un Select count dentro de tu SP y en vez de usar el ExecuteNonQuery puedes usar el ExecuteScalar

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & 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 21:27.