none
Como verificar la conexion a una base de datos sql desde c# RRS feed

  • Pregunta

  • Hola guys haganme el favor y me ayudan:

    Tengo la siguiente estructura de datos que visual studio 2012 c# no me admite 

    private static bool Desconectado()
            {
                SqlConnection cnn = new SqlConnection();
                try
                {

                    if  cnn.State=connectionState.open    ( -el problema esta aqui en este renglon ....marca error en cnn.State y en open)que renglon debo poner aqui?

                    then 

                      cnn,close()

                     return true

                    else

                    return false

                 endif

    POr cual estructura debo cambiar esta para q el compilador me la ecepte.No tengo problema con el try

    gracias muchachos por su colaboracion

    jueves, 12 de diciembre de 2019 3:26

Respuestas

  • hola

    Creo que estas mezclando lenguajes, que hace un "then" es el codigo que nos muestras ?

    Personalmente no recomendaria que programes de esa forma con algo que conecte o desconecte, programa una capa de acceso a datos

    [WinForms] Edición Empleados

    analiza el ejemplo como puedes definir la conexion en un bloque using y asi optimizar que se destruya el objeto de conexion cuando ya no lo usas, pero ademas que aplique el Conection Pool de ado.net

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Pablo RubioModerator jueves, 12 de diciembre de 2019 16:10
    • Marcado como respuesta balboa20133 sábado, 14 de diciembre de 2019 4:00
    jueves, 12 de diciembre de 2019 3:30
  • Te garantizo al 100% que ese código en C# NO FUNCIONARÁ.

    Puede ser que el original que convertiste desde VB tuviese, por ejemplo, la variable cnn declarada dentro de un módulo o declarada en una clase como Shared, o alguna cosa parecida. Pero en C#, declarándola como variable local, no puede funcionar.

    Fíjate que escribes: try { SqlConnection cnn = ...

    Al estar la declaración justo detrás de una llave, la variable es local a ese bloque. Eso significa que al llegar a la llave final } esa variable desaparece (y por lo tanto el objeto al que apunta se vuelve inalcanzable y ya no se puede usar para nada).

    La variable bool que dices que se devuelve sí que se devuelve. Pero la variable cnn no se devuelve. Esa variable se pierde.

    > Es el mismo cnn objeto de conexion alberto

    NO, no es el mismo. Cada vez que llamas al operador "new" se crea una nueva instancia del objeto. No te da acceso a la instancia anterior, a pesar de que la variable la hayas escrito en otro sitio con el mismo nombre.

    Si en VB funcionaba, indicaría una traducción incorrecta a C#. Por ejemplo, a lo mejor la variable estaba declarada como global en VB mientras que en C# se ha declarado como local.

    • Marcado como respuesta balboa20133 sábado, 14 de diciembre de 2019 3:48
    viernes, 13 de diciembre de 2019 20:45
    Moderador

Todas las respuestas

  • hola

    Creo que estas mezclando lenguajes, que hace un "then" es el codigo que nos muestras ?

    Personalmente no recomendaria que programes de esa forma con algo que conecte o desconecte, programa una capa de acceso a datos

    [WinForms] Edición Empleados

    analiza el ejemplo como puedes definir la conexion en un bloque using y asi optimizar que se destruya el objeto de conexion cuando ya no lo usas, pero ademas que aplique el Conection Pool de ado.net

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Pablo RubioModerator jueves, 12 de diciembre de 2019 16:10
    • Marcado como respuesta balboa20133 sábado, 14 de diciembre de 2019 4:00
    jueves, 12 de diciembre de 2019 3:30
  • Aparte de la mezcla de lenguajes (el principio de tu código es C# y el resto es VB, con lo que tanto un compilador como el otro arrojará un error), hay un problema con tu código que hará que no funcione incluso después de que lo escribas todo en el mismo lenguaje:

    Primero creas un "new SqlConnection". Y luego preguntas por su propiedad cnn.State. En este punto el State nunca va a ser Open, porque la conexión está recién creada y no la has abierto (es más, de hecho ni siquiera la has inicializado). Así que este mecanismo no sirve para verificar la conexión.

    jueves, 12 de diciembre de 2019 7:28
    Moderador
  • hola:

    Si claro q ya esta abierta la conexion asi:

    public class Conexion
        {
            private static object connectionState;
            public int idusuario;
            private static bool Conectado()
            {

                try
                {
                    SqlConnection cnn = new SqlConnection("data source=diegopc/sqlexpress2;initial catalog=sisventas;" +
                "integrated security=true");
                    cnn.Open();
                    return true;
                }
                catch (Exception)
                {
                    MessageBox.Show("Error en conexion");
                    return false;
                }
            }
            private static bool Desconectado()
            {
                SqlConnection cnn = new SqlConnection();
                try
                {
                    if  (cnn.State=Conexionstate.open) 

                        {
                        }
                }
                catch
                {
                                }
                //private static void NewMethod()
                //{
                // MessageBox.Show("El valor booleano es:" + Conectado());
                //}
                 }
    }
    viernes, 13 de diciembre de 2019 1:34
  • Hola

    que pena im sorry

    este es el codigo :

    public class Conexion
        {
            
            public int idusuario;
            private static bool Conectado()
            {

                try
                {
                    SqlConnection cnn = new SqlConnection("data source=diegopc/sqlexpress2;initial catalog=sisventas;" +
                "integrated security=true");
                    cnn.Open();
                    return true;
                }
                catch (Exception)
                {

                    MessageBox.Show("Error en conexion");
                    return false;
                }

            }

            private static bool Desconectado()
            {
                SqlConnection cnn = new SqlConnection();
                try
                {
                    if  (cnn.State=Conexionstate.open) 

                        {
                        }
                }
                catch
                {
                                }
                
                }
                 }
    }

    viernes, 13 de diciembre de 2019 1:39
  • Hay un error gravísimo en ese código.

    En el método Conectado() abres una conexión, y seguidamente retornas del método y no haces nada con la conexión. Esa conexión está en una variable local, por lo que se vuelve inalcanzable al salir del método. Por lo tanto, se te queda "perdida" en memoria una conexión abierta a la que ahora es imposible acceder y no se puede cerrar. Después de pasar por ahí unas cuantas veces, se agotará el Pool de conexiones y comenzarás a obtener errores en otros sitios del programa, y esto es dificilísimo de depurar. Por eso digo que es "gravísimo". Causa en los programas problemas muy difíciles de resolver.

    Por otra parte, en el método Desconectado abres una nueva conexión (¡no es la misma que has abierto antes!) y preguntas si está abierta. Lógicamente, esta conexión nunca puede estar abierta, porque la acabas de construir y no la has abierto (la que abriste es otra distinta que ahora se ha vuelto inaccesible).


    viernes, 13 de diciembre de 2019 8:06
    Moderador
  • Hola Alberto :

    La verdad tomé un programa que ejecuta 100 por ciento con esta estructura para un sistema de ventas 

    pequeño hecho en visual basic.net y yo me estoy tomando el trabajo de tomar la mismas instrucciones

    y pasarlas a c# sin cambiar la estructura.

    Te voy a dar el link del ingeniero que hizo este programa y lo explica paso a paso por youtube

    hecho claro esta en visual basic.

    Tu dices : En el método Conectado() abres una conexión, y seguidamente retornas del método y no haces nada con la conexión.

    Claro que no hago nada porque el programa es todavia mas grande y despues se utilizara el metodo porque realmente lo que llamas metodo no es un metodo es ua funcion que se llama mucho despues y ademas si tu ves se esta enviando una variable bool para que cuando yo llame la funcion conectado() me lea la variable bool ,pero todavia le hace falta para llegar alli hastaque no llame la funcion desde otroprocedimeinto........

    dices:Esa conexión está en una variable local, por lo que se vuelve inalcanzable al salir del método.

    Me disculpas por mi opinion humilde pero no es inalcanzable si te refieres a cnn, porque despues cuando crea 

    otros vaRIABLES por ejemplo con sqlcommand la voy a necesitar y es alcanzable.

    Por otra parte, en el método Desconectado abres una nueva conexión (¡no es la misma que has abierto antes!):

    Es el mismo cnn objeto de conexion alberto.

    Alberto te invito a quemires la ejecucion del programa en visual basic y ejecuta 100 por ciento con la estructura de datos que esta escrita alli en el programa.Luego no es un erro gravisimo como dices se puede con esa estructura construir el rpograma.Disculpame si de pronto te estoy contrariando .

    MIra el lik es: https://www.youtube.com/watch?v=gcbiC0Yl7-k&list=PLZPrWDz1MolrLX9wU0iQQgKV44tEJZb7H&index=2

    minuto 10.30

    Claro que todavia no se utiliza conectado() porque se utiliza  mucho despues en otro video.

    Es un programa de ventas que ejecuta 100 por ciento con esta estructura entonces no entiendo lo q me envias.

    viernes, 13 de diciembre de 2019 19:25
  • Te garantizo al 100% que ese código en C# NO FUNCIONARÁ.

    Puede ser que el original que convertiste desde VB tuviese, por ejemplo, la variable cnn declarada dentro de un módulo o declarada en una clase como Shared, o alguna cosa parecida. Pero en C#, declarándola como variable local, no puede funcionar.

    Fíjate que escribes: try { SqlConnection cnn = ...

    Al estar la declaración justo detrás de una llave, la variable es local a ese bloque. Eso significa que al llegar a la llave final } esa variable desaparece (y por lo tanto el objeto al que apunta se vuelve inalcanzable y ya no se puede usar para nada).

    La variable bool que dices que se devuelve sí que se devuelve. Pero la variable cnn no se devuelve. Esa variable se pierde.

    > Es el mismo cnn objeto de conexion alberto

    NO, no es el mismo. Cada vez que llamas al operador "new" se crea una nueva instancia del objeto. No te da acceso a la instancia anterior, a pesar de que la variable la hayas escrito en otro sitio con el mismo nombre.

    Si en VB funcionaba, indicaría una traducción incorrecta a C#. Por ejemplo, a lo mejor la variable estaba declarada como global en VB mientras que en C# se ha declarado como local.

    • Marcado como respuesta balboa20133 sábado, 14 de diciembre de 2019 3:48
    viernes, 13 de diciembre de 2019 20:45
    Moderador
  • Hay cada cosa en este Foro, Alberto .... no tiene la más remota idea, ... le explicas con total claridad y corrección ... y te discute!!!! ... hay algunos que no se dejan ayudar ...

    Ya que estoy, te pregunto ... vos sos Moderator, también, como Diana Acuña y Pablo Rubio? ... porque veo que ahí dice "Moderador" ... gracias

    Pablo

    viernes, 13 de diciembre de 2019 21:08
  • ...........Gracias Alberto por tu explicacion.

    sábado, 14 de diciembre de 2019 2:33
  • le explicas con total claridad y corrección ... y te discute!!!!

    En este caso es correcto que se discuta. No quedaba suficientemente claro el por qué no podía funcionar en C#. Aparentemente el OP no comprendía suficientemente el tema del alcance de las variables en C#, y esto requería ser explicado (y puede que todavía requiera alguna explicación más). Los foros están para eso, y no tengo inconveniente en aclarar más cosas si son necesarias. Para "balboa20133": No te preocupes, pregunta cuanto necesites.

    Sí, soy moderador de este foro. Pero normalmente no "modero" mucho, no porque no quiera, sino porque los otros moderadores son tan activos que usualmente no me queda nada que moderar :-)

    sábado, 14 de diciembre de 2019 8:22
    Moderador
  • Alberto, me parece muy bueno tus ganas de ayudar, creo modestamente que comparto eso con vos. Quizás la palabra más correcta en lugar de "discutir" es "contradecir". O sea, lo que quise decir es "qué equivocado estaba balboa20133 que te contradecía lo que vos le explicabas". Coincido también con vos en que el Foro es para que se pregunte lo que quiera cada uno y las veces que sea necesario. Sólo que me pareció equivocado lo de contradecir lo que se le estaba explicando. 

    A propósito, te pregunto, si un objeto queda desreferenciado, no lo elimina de la memoria el GC? Si es una conexión abierta, no se supone que deje de existir y se "cierre" la conexión? Me surgió esa duda de leer este thread ...

    sábado, 14 de diciembre de 2019 19:40
  • A propósito, te pregunto, si un objeto queda desreferenciado, no lo elimina de la memoria el GC? Si es una conexión abierta, no se supone que deje de existir y se "cierre" la conexión?

    No, en .NET el GC no funciona de manera inmediata. Los objetos que no tienen ninguna referencia, se denominan "inalcanzables" y quedan a disposición del GC. Pero el GC no se ejecuta de inmediato. Cuando más adelante la memoria "escasea", y se necesita asignar para un nuevo objeto, en ese momento se ejecuta el GC y comienza a eliminar los objetos con el fin de hacer "hueco" para la nueva asignación de memoria. Esto puede ser que no ocurra hasta que cierres la aplicación, en caso de que no exista suficiente presión de memoria para disparar el GC. Cuando el GC encuentra un objeto que contiene un Finalizador activo (como por ejemplo, una conexión que no se ha cerrado) entonces pone el objeto en un sitio que se llama la "cola de destrucción", y entonces deja de ser inalcanzable porque se puede alcanzar a través de la cola. Se ejecuta un hilo distinto que va llamando a todos los finalizadores de todos los objetos que haya en la cola de destrucción. Cuando por fin le toque el turno a nuestra conexión, entonces se ejecuta su finalizador y en ese momento es cuando de verdad se cierra la conexión. Entonces se quita de la cola con lo que vuelve a ser inalcanzable, y en la siguiente pasada del GC ya se elimina de la memoria porque su finalizador no está pendiente.

    Todo lo anterior podría tardar "horas" o incluso no ejecutarse hasta que se cierre la aplicación, si no hay presión de memoria que fuerce a que ocurra antes. Por lo tanto, la conexión potencialmente podría no cerrarse hasta mucho después de haber liberado su referencia.

    sábado, 14 de diciembre de 2019 20:07
    Moderador