Codigo correcto

09/03/2006 - 11:16 por CC | Informe spam
Hola a todos: estoy migrando un proyecto a 2005, y me encuentro con muchos
'Warnings' que dicen:

"La variable oReader se utiliza antes de que se le haya asignado un valor.
Podria darse una excepción de referencia nula en tiempo de ejecucion.

Os pongo un ejemplo a continuacion, en donde estaria marcado como 'Warning'
el oReader.Close del Catch.

Cual seria la forma correcta de escribir esta funcion.

Muchas gracias por vuestra ayuda

Natalia



Public Function XXX(ByVal ..) As Boolean

Dim oReader As SqlClient.SqlDataReader

Try

..

oReader = oCommand.ExecuteReader()

oReader.Read()

.

oReader.Close()

Catch x As Exception

.

oReader.Close()

End Try

End Function

Preguntas similare

Leer las respuestas

#1 Luis Miguel Blanco
09/03/2006 - 12:11 | Informe spam
Hola CC

Por el código que adjuntas, entiendo que has declarado la variable oReader,
pero no la has instanciado.

El soporte de Intellisense en Visual Studio 2005 es todavía más potente si
cabe que en versiones anteriores del entorno, por ello, cuando declaras una
variable que va a contener un objeto, pero no has instanciado un objeto de la
clase correspondiente y lo has asignado a dicha variable, Intellisense te
avisa de dicha circunstancia.

Esta situación, que puede parecer banal, es un problema yo creo muy
frecuente, por lo cual, resulta de mucha ayuda que el entorno te avise de las
variables de objeto que no han sido asignadas, ya que tal y como está el
código de tu ejemplo, cuando en tiempo de ejecución llegues a la línea:

oReader = oCommand.ExecuteReader()

Se va a producir un error por no haber instanciado un objeto SqlDataReader
para esa variable. De ahí el aviso o warning de Intellisense, que nos viene
francamente bien creo yo 8-)

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"CC" wrote:

Hola a todos: estoy migrando un proyecto a 2005, y me encuentro con muchos
'Warnings' que dicen:

"La variable oReader se utiliza antes de que se le haya asignado un valor.
Podria darse una excepción de referencia nula en tiempo de ejecucion.

Os pongo un ejemplo a continuacion, en donde estaria marcado como 'Warning'
el oReader.Close del Catch.

Cual seria la forma correcta de escribir esta funcion.

Muchas gracias por vuestra ayuda

Natalia



Public Function XXX(ByVal ..) As Boolean

Dim oReader As SqlClient.SqlDataReader

Try

..

oReader = oCommand.ExecuteReader()

oReader.Read()

.

oReader.Close()

Catch x As Exception

.

oReader.Close()

End Try

End Function



Respuesta Responder a este mensaje
#2 CC
09/03/2006 - 12:26 | Informe spam
Gracias por tu respuesta Luis Miguel.

El tema es como instanciar la variable oReader, y donde.
Adjuntame por favor un ejemplo con un SqlClient.SqlDataReader. Si puede ser,
me gustaria instanciarla dentro del Try (soy un maniatico del try catch).
Gracias

Natalia


"Luis Miguel Blanco" escribió
en el mensaje news:
Hola CC

Por el código que adjuntas, entiendo que has declarado la variable
oReader,
pero no la has instanciado.

El soporte de Intellisense en Visual Studio 2005 es todavía más potente si
cabe que en versiones anteriores del entorno, por ello, cuando declaras
una
variable que va a contener un objeto, pero no has instanciado un objeto de
la
clase correspondiente y lo has asignado a dicha variable, Intellisense te
avisa de dicha circunstancia.

Esta situación, que puede parecer banal, es un problema yo creo muy
frecuente, por lo cual, resulta de mucha ayuda que el entorno te avise de
las
variables de objeto que no han sido asignadas, ya que tal y como está el
código de tu ejemplo, cuando en tiempo de ejecución llegues a la línea:

oReader = oCommand.ExecuteReader()

Se va a producir un error por no haber instanciado un objeto SqlDataReader
para esa variable. De ahí el aviso o warning de Intellisense, que nos
viene
francamente bien creo yo 8-)

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"CC" wrote:

Hola a todos: estoy migrando un proyecto a 2005, y me encuentro con
muchos
'Warnings' que dicen:

"La variable oReader se utiliza antes de que se le haya asignado un
valor.
Podria darse una excepción de referencia nula en tiempo de ejecucion.

Os pongo un ejemplo a continuacion, en donde estaria marcado como
'Warning'
el oReader.Close del Catch.

Cual seria la forma correcta de escribir esta funcion.

Muchas gracias por vuestra ayuda

Natalia



Public Function XXX(ByVal ..) As Boolean

Dim oReader As SqlClient.SqlDataReader

Try

..

oReader = oCommand.ExecuteReader()

oReader.Read()

.

oReader.Close()

Catch x As Exception

.

oReader.Close()

End Try

End Function



Respuesta Responder a este mensaje
#3 Luis Miguel Blanco
09/03/2006 - 12:36 | Informe spam
Hola CC

Por el código que adjuntas, entiendo que has declarado la variable oReader,
pero no la has instanciado.

El soporte de Intellisense en Visual Studio 2005 es todavía más potente si
cabe que en versiones anteriores del entorno, por ello, cuando declaras una
variable que va a contener un objeto, pero no has instanciado un objeto de la
clase correspondiente y lo has asignado a dicha variable, Intellisense te
avisa de dicha circunstancia.

Esta situación, que puede parecer banal, es un problema yo creo muy
frecuente, por lo cual, resulta de mucha ayuda que el entorno te avise de las
variables de objeto que no han sido asignadas, ya que tal y como está el
código de tu ejemplo, cuando en tiempo de ejecución llegues a la línea:

oReader = oCommand.ExecuteReader()

Se va a producir un error por no haber instanciado un objeto SqlDataReader
para esa variable. De ahí el aviso o warning de Intellisense, que nos viene
francamente bien creo yo 8-)

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"CC" wrote:

Hola a todos: estoy migrando un proyecto a 2005, y me encuentro con muchos
'Warnings' que dicen:

"La variable oReader se utiliza antes de que se le haya asignado un valor.
Podria darse una excepción de referencia nula en tiempo de ejecucion.

Os pongo un ejemplo a continuacion, en donde estaria marcado como 'Warning'
el oReader.Close del Catch.

Cual seria la forma correcta de escribir esta funcion.

Muchas gracias por vuestra ayuda

Natalia



Public Function XXX(ByVal ..) As Boolean

Dim oReader As SqlClient.SqlDataReader

Try

..

oReader = oCommand.ExecuteReader()

oReader.Read()

.

oReader.Close()

Catch x As Exception

.

oReader.Close()

End Try

End Function



Respuesta Responder a este mensaje
#4 Luis Miguel Blanco
09/03/2006 - 13:10 | Informe spam
Hola Natalia

Te ruego me disculpes, ya que he enviado la misma respuesta dos veces, pero
es que la red está haciendo hoy cosas un tanto extrañas, y en el primer envío
de la respuesta me ha dado un error, pero parece que ha llegado.

En este ejemplo que me comentas, quizá me he precipitado un poco en la
respuesta, ya que dado que estás ejecutando el método
SqlCommand.ExecuteReader(), no necesitas instanciar explícitamente un objeto
SqlDataReader, puesto que ya te lo devuelve el método del comando.

El lugar de la declaración de la variable considero que es correcta: al
comienzo del método, pero el Intellisense te estará dando un aviso en el
bloque Catch del Try debido a que la asignación del objeto DataReader a la
variable se produce dentro del Try, y el bloque Catch no "ve" dicha
asignación y por eso te avisa, pero durante la ejecución, una vez que se ha
ejecutado la línea

oReader = oCommand.ExecuteReader()

si luego se produce un error que haga saltar el flujo al Catch no debería
haber problema puesto que la variable sí que ha sido asignada.

Puedes probar a forzar un error y ver que el Catch está correcto usando la
sentencia Throw

oReader = oCommand.ExecuteReader()
Throw New Exception()

Con esto saltará al Catch y oReader.Close() debería funcionar, en caso
contrario me comentas 8-)

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"CC" wrote:

Gracias por tu respuesta Luis Miguel.

El tema es como instanciar la variable oReader, y donde.
Adjuntame por favor un ejemplo con un SqlClient.SqlDataReader. Si puede ser,
me gustaria instanciarla dentro del Try (soy un maniatico del try catch).
Gracias

Natalia


"Luis Miguel Blanco" escribió
en el mensaje news:
> Hola CC
>
> Por el código que adjuntas, entiendo que has declarado la variable
> oReader,
> pero no la has instanciado.
>
> El soporte de Intellisense en Visual Studio 2005 es todavía más potente si
> cabe que en versiones anteriores del entorno, por ello, cuando declaras
> una
> variable que va a contener un objeto, pero no has instanciado un objeto de
> la
> clase correspondiente y lo has asignado a dicha variable, Intellisense te
> avisa de dicha circunstancia.
>
> Esta situación, que puede parecer banal, es un problema yo creo muy
> frecuente, por lo cual, resulta de mucha ayuda que el entorno te avise de
> las
> variables de objeto que no han sido asignadas, ya que tal y como está el
> código de tu ejemplo, cuando en tiempo de ejecución llegues a la línea:
>
> oReader = oCommand.ExecuteReader()
>
> Se va a producir un error por no haber instanciado un objeto SqlDataReader
> para esa variable. De ahí el aviso o warning de Intellisense, que nos
> viene
> francamente bien creo yo 8-)
>
> Un saludo
> Luis Miguel Blanco
> http://www.dotnetmania.com
>
>
> "CC" wrote:
>
>> Hola a todos: estoy migrando un proyecto a 2005, y me encuentro con
>> muchos
>> 'Warnings' que dicen:
>>
>> "La variable oReader se utiliza antes de que se le haya asignado un
>> valor.
>> Podria darse una excepción de referencia nula en tiempo de ejecucion.
>>
>> Os pongo un ejemplo a continuacion, en donde estaria marcado como
>> 'Warning'
>> el oReader.Close del Catch.
>>
>> Cual seria la forma correcta de escribir esta funcion.
>>
>> Muchas gracias por vuestra ayuda
>>
>> Natalia
>>
>>
>>
>> Public Function XXX(ByVal ..) As Boolean
>>
>> Dim oReader As SqlClient.SqlDataReader
>>
>> Try
>>
>> ..
>>
>> oReader = oCommand.ExecuteReader()
>>
>> oReader.Read()
>>
>> .
>>
>> oReader.Close()
>>
>> Catch x As Exception
>>
>> .
>>
>> oReader.Close()
>>
>> End Try
>>
>> End Function
>>
>>
>>



Respuesta Responder a este mensaje
#5 CC
09/03/2006 - 13:54 | Informe spam
De nuevo gracias por tu respuesta.

Con tu respuesta, volvemos al inicio de la pregunta.

Es decir, yo ya he probado que el codigo es correcto, y que en caso de error
no pasa nada

Pero el 'problema' es que el Intellisense me sigue dando da el aviso, y esto
es lo que quiero evitar, ya que este mismo codigo lo tengo al menos en 50
sitios mas en mi proyecto, con lo que el apartado de warnings solo veo
errores de este tipo. Tampoco lo que quiero es quitar que me avise de este
tipo de warnings, ya que es basico que los avise.

Aunque sé que el codigo es correcto, seguro que puede escribirse de otra
forma (mas correcta) para evitar el warning.

No se, alguna idea ?????

Gracias:

Natalia

"Luis Miguel Blanco" escribió
en el mensaje news:
Hola Natalia

Te ruego me disculpes, ya que he enviado la misma respuesta dos veces,
pero
es que la red está haciendo hoy cosas un tanto extrañas, y en el primer
envío
de la respuesta me ha dado un error, pero parece que ha llegado.

En este ejemplo que me comentas, quizá me he precipitado un poco en la
respuesta, ya que dado que estás ejecutando el método
SqlCommand.ExecuteReader(), no necesitas instanciar explícitamente un
objeto
SqlDataReader, puesto que ya te lo devuelve el método del comando.

El lugar de la declaración de la variable considero que es correcta: al
comienzo del método, pero el Intellisense te estará dando un aviso en el
bloque Catch del Try debido a que la asignación del objeto DataReader a la
variable se produce dentro del Try, y el bloque Catch no "ve" dicha
asignación y por eso te avisa, pero durante la ejecución, una vez que se
ha
ejecutado la línea

oReader = oCommand.ExecuteReader()

si luego se produce un error que haga saltar el flujo al Catch no debería
haber problema puesto que la variable sí que ha sido asignada.

Puedes probar a forzar un error y ver que el Catch está correcto usando la
sentencia Throw

oReader = oCommand.ExecuteReader()
Throw New Exception()

Con esto saltará al Catch y oReader.Close() debería funcionar, en caso
contrario me comentas 8-)

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"CC" wrote:

Gracias por tu respuesta Luis Miguel.

El tema es como instanciar la variable oReader, y donde.
Adjuntame por favor un ejemplo con un SqlClient.SqlDataReader. Si puede
ser,
me gustaria instanciarla dentro del Try (soy un maniatico del try catch).
Gracias

Natalia


"Luis Miguel Blanco"
escribió
en el mensaje news:
> Hola CC
>
> Por el código que adjuntas, entiendo que has declarado la variable
> oReader,
> pero no la has instanciado.
>
> El soporte de Intellisense en Visual Studio 2005 es todavía más potente
> si
> cabe que en versiones anteriores del entorno, por ello, cuando declaras
> una
> variable que va a contener un objeto, pero no has instanciado un objeto
> de
> la
> clase correspondiente y lo has asignado a dicha variable, Intellisense
> te
> avisa de dicha circunstancia.
>
> Esta situación, que puede parecer banal, es un problema yo creo muy
> frecuente, por lo cual, resulta de mucha ayuda que el entorno te avise
> de
> las
> variables de objeto que no han sido asignadas, ya que tal y como está
> el
> código de tu ejemplo, cuando en tiempo de ejecución llegues a la línea:
>
> oReader = oCommand.ExecuteReader()
>
> Se va a producir un error por no haber instanciado un objeto
> SqlDataReader
> para esa variable. De ahí el aviso o warning de Intellisense, que nos
> viene
> francamente bien creo yo 8-)
>
> Un saludo
> Luis Miguel Blanco
> http://www.dotnetmania.com
>
>
> "CC" wrote:
>
>> Hola a todos: estoy migrando un proyecto a 2005, y me encuentro con
>> muchos
>> 'Warnings' que dicen:
>>
>> "La variable oReader se utiliza antes de que se le haya asignado un
>> valor.
>> Podria darse una excepción de referencia nula en tiempo de ejecucion.
>>
>> Os pongo un ejemplo a continuacion, en donde estaria marcado como
>> 'Warning'
>> el oReader.Close del Catch.
>>
>> Cual seria la forma correcta de escribir esta funcion.
>>
>> Muchas gracias por vuestra ayuda
>>
>> Natalia
>>
>>
>>
>> Public Function XXX(ByVal ..) As Boolean
>>
>> Dim oReader As SqlClient.SqlDataReader
>>
>> Try
>>
>> ..
>>
>> oReader = oCommand.ExecuteReader()
>>
>> oReader.Read()
>>
>> .
>>
>> oReader.Close()
>>
>> Catch x As Exception
>>
>> .
>>
>> oReader.Close()
>>
>> End Try
>>
>> End Function
>>
>>
>>



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida