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

ayuda con este codigo por favor

Estas en el tema de ayuda con este codigo por favor en el foro de .NET en Foros del Web. Hola Foro. Tengo el siguiente codigo al cual le paso como parametros dos id's el del proyecto y el de la etapa del proyecto con ...
  #1 (permalink)  
Antiguo 22/02/2005, 18:13
Avatar de grisel  
Fecha de Ingreso: diciembre-2004
Ubicación: Mexico
Mensajes: 215
Antigüedad: 20 años, 2 meses
Puntos: 0
Pregunta ayuda con este codigo por favor

Hola Foro.
Tengo el siguiente codigo al cual le paso como parametros dos id's el del proyecto y el de la etapa del proyecto con la finalidad de ver si si encuenrta un informe registrado para ese proyecto la query ya la hice en el analizador de consultas asi que me estado preguntando donde esta mi error ya que me manda el error de : "REFERENCIA A INSTANCIA DE OBJETO NO ENCONTRADO"

cuando lo voy ejecutando linea por linea es exactamente en la linea de query donde me marcar el error.

en caso de que no se encuentre ningun informe registrado para esos id's tendria q regresarme "".
cuando estoy posicionada en esa linea cuando lo ejecuto por pasos compruebo que las id's tengan los valores que deben traer y de hecho si los trae, entonces no se a que se deba este error.


public int ObtenerId(int idProyecto, int idEtapa)
{
DBTools.sqlDBToolsVB oDB = new DBTools.sqlDBToolsVB();

string identificador = (string)oDB.EjecutaScalar ("SELECT idInforme FROM Itecnico WHERE idEtapa="+idEtapa.ToString()+" AND idProyecto="+idProyecto.ToString());

if(identificador == "")
return -1;
else
return int.Parse (identificador);
}

Les agradesco de antemano si me pudieran ayudar de verdad.
gracias y buen dia
__________________
grissss :Zzz:
  #2 (permalink)  
Antiguo 22/02/2005, 18:57
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 23 años, 1 mes
Puntos: 50
Hola grisel... creo que para empezar cuando usas un ExecuteScalar es para devolver funciones agregadas (avg, count, sum, etc) y es por eso que te está marcando error.

Mas bien tu code podría quedar así:

Cita:
public int ObtenerId(int idProyecto, int idEtapa)
{
DBTools.sqlDBToolsVB oDB = new DBTools.sqlDBToolsVB();

int identificador = (int)oDB.EjecutaScalar ("SELECT count(idInforme) FROM Itecnico WHERE idEtapa="+idEtapa.ToString()+" AND idProyecto="+idProyecto.ToString());

if(identificador == 0)
return -1;
else
return identificador;
}
Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #3 (permalink)  
Antiguo 22/02/2005, 19:06
Avatar de grisel  
Fecha de Ingreso: diciembre-2004
Ubicación: Mexico
Mensajes: 215
Antigüedad: 20 años, 2 meses
Puntos: 0
Hola Rookt

Sabes probe lo que mandaste y ya no me marco el error , solo tengo una duda el count me contara todos los informes que tenga la clave de la etapa y del proyecto. Para este caso solo se registrara un idinforme por una etapa y por proyecto.
Por lo tanto no afectara en nada en que le ponga count.

o dime si estoy mal creeme que ya me estaba volviendo loca con todo eso.
te lo agradesco mucho sale
__________________
grissss :Zzz:
  #4 (permalink)  
Antiguo 23/02/2005, 02:27
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 4 meses
Puntos: 8
Rootk, creo que en este caso te equivocas (por primera vez desde que estoy en el foro), por lo menos en mysql (utlizando el conector proporcionado por ellos) si haces un select id o un select a un unico elemento, y un executescalar, te devuelve el elemento, en caso de que haya mas de una línea afectada, te devuelve el último de la consulta, el caso de que no encuentre ninguno te devolvera NULL.

if identificador

Además si haces el count(id), te devolverá el número de filas afecatadas, no el identificador que creo que es lo que quiere devolver grisel.

Yo creo que el fallo esta cuando le pasas a la query los valores de idProyecto e idEtapa, asegurate en la ejecución paso a paso de que tienen algún valor. Si sí que tienen valor copia la consulta y ejecutala en tu gestor de base de datos para ver que valor te devueve.
  #5 (permalink)  
Antiguo 23/02/2005, 09:03
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 23 años, 1 mes
Puntos: 50
Cita:
creo que en este caso te equivocas (por primera vez desde que estoy en el foro), por lo menos en mysql (utlizando el conector proporcionado por ellos) si haces un select id o un select a un unico elemento, y un executescalar, te devuelve el elemento
Estoy de acuerdo en eso friend, solo que el ejemplo del count lo puse como referencia ya que precisamente el executescalar por lo regular es para funciones agregadas...

En fin, pero si lo que quieres es saber si existe ese registro porque no mejor lo haces un datareader y un command y si encontro un valor lo asignas y si no regresas el -1

Ejemplo:

Cita:
...
...
int identificador = 0;
myReader = myCommand.ExecuteReader();
if (myReader.Read())
identificador = (int) dr("idInforme ");
else
identificador = -1

return identificador;
Creo que asi esta mas fácil no creen ?
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #6 (permalink)  
Antiguo 23/02/2005, 09:56
Avatar de grisel  
Fecha de Ingreso: diciembre-2004
Ubicación: Mexico
Mensajes: 215
Antigüedad: 20 años, 2 meses
Puntos: 0
Ok asi es lo que yo quiero es que me devuelva el identificador, no el numero de filas afectadas. Es bueno lo comentas Rookt pero en la aplicacion en la que estoy trabajando utlizo un componente llamdo DBTools que es donde se instacia lo de ExecuteScalar. el query como tal lo ejecuto en el analizador de sql y esta bien, ok ahora hice lo que sugirio jose ejecute por partes la aplicacion y cuando llego a esa linea veirifico que el idproyecto y el id edetapa tengan los valores correspondientes y de hecho los trae, entonces no se en que momento se me esta perdiendo esa referencia ya que el query no puede ser, creo yo que los ids que paso como parametros tampoco por lo que les acabo de comentar y ya he utlizado anteriormente en otras partes del codigo la DBtools osea que no se que pueda ser.

les agradesco de antemano sus comentarios y su ayuda.
saludos y bye
__________________
grissss :Zzz:
  #7 (permalink)  
Antiguo 23/02/2005, 10:17
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 20 años, 4 meses
Puntos: 8
Bien, si los idproyecto e idetapa son correcots, el valor lo pierdes en el identificador, cuando haces identificador = .executescalar, si executescalar devuelve null, identificador pasa a ser null, comprueba, que la consulta para esos valores de idetapa e idproyecto devuelve algo, porque seguramente sea la b.d. la que te devuelve en null.

Si es ese el caso, haz lo siguiente en la comprobacion
if identificador.tostring() == ""
return -1
else
return identificador
end if
  #8 (permalink)  
Antiguo 23/02/2005, 13:23
Avatar de grisel  
Fecha de Ingreso: diciembre-2004
Ubicación: Mexico
Mensajes: 215
Antigüedad: 20 años, 2 meses
Puntos: 0
Hola de nuevo

Depsues de estar peleandome un buen rato con este codigo lo modifique y ahora si me funciona le hice los siguientes cambios.

Me fue de mucha ayuda sus comentarios


public int ObtenerId(int idProyecto, int idEtapa)
{
DBTools.sqlDBToolsVB oDB = new DBTools.sqlDBToolsVB();
object resultado = oDB.EjecutaScalar("SELECT idinforme FROM Itecnico WHERE idproyecto = "+idProyecto.ToString()+" AND idetapa = " + idEtapa.ToString());

if(resultado == null)
{
return -1;
}
else
{
return (int)oDB.EjecutaScalar("SELECT idinforme FROM ITecnico WHERE idproyecto = "+idProyecto.ToString()+" AND idetapa = " + idEtapa.ToString());
}
}

saludos y que tengan un bonito dia
__________________
grissss :Zzz:
  #9 (permalink)  
Antiguo 23/02/2005, 13:41
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 23 años, 1 mes
Puntos: 50
Solo para completar tu code sería mejor así..

Cita:
if(resultado == null)
{
return -1;
}
else
{
return (int) resultado;
}
Para que no vuelvas a hacer una peticion a la BD, ya que tienes el resultado..
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 09:02.