Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Error Referencia a objeto no establecida como instancia C#
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Error Referencia a objeto no establecida como instancia C#

Publicar nuevo tema Responder al tema
Foros de discusión » VB.Net, C# .Net, Visual Studio .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Error Referencia a objeto no establecida como instancia C# Responder citando

Estoy desarrollando una aplicación en Visual Studio .Net, en C# CSharp, utilizo como base de datos SQLite y ADO para conectarme. La función que uso para conectarme a la BD SQLite:


Código:

        using System.Data.SQLite;
        using System.Data.SqlClient;
        using System.Data;

        public SQLiteConnection conexionSQLite;

        //conectar con la base de datos SQLite
        public bool conectarBDSQLite (string fichero,
            string contrasena, ref string resultado)
        {
            //si existe la BD SQLite
            if (System.IO.File.Exists(fichero))
            {
                string stringConexionSQLite =
                    String.Format("Data Source={0}", fichero);
                try
                {
                    conexionSQLite = new SQLiteConnection(stringConexionSQLite);
                    if (contrasena != "")
                        conexionSQLite.SetPassword(contrasena);
                    conexionSQLite.Open();
                    resultado = System.DateTime.Now + " " +
                        "Conectado a la BD SQLite correctamente";
                    return true;
                }
                catch (Exception error)
                {
                    resultado = System.DateTime.Now + " " +
                        "Error al abrir BD SQLite: " + error.Message;
                    return false;
                }
            }
            else
            {
                resultado = System.DateTime.Now + " " +
                    "Error al abrir BD SQLite: no existe el fichero " +
                    fichero;
                return false;
            }
        }


La conexión la hace bien, por ejemplo esta función que inserta un registro funciona perfecta:

Código:

       //insertar nuevo seguidor en BD SQLite
        public void insertarSeguidor(long idSeguidor, ref string resultado)
        {
            string consultaSQL =
                "insert into seguidores (id, fecha) values (@idSeguidor,  @fecha)";
            try
            {
                SQLiteParameter parametroFecha = new SQLiteParameter();
                parametroFecha.ParameterName = "@fecha";
                parametroFecha.DbType = DbType.DateTime;
                parametroFecha.Value = System.DateTime.Now;
                SQLiteParameter parametroidSeguidor = new SQLiteParameter();
                parametroidSeguidor.ParameterName = "@idSeguidor";
                parametroidSeguidor.DbType = DbType.String;
                parametroidSeguidor.Value = Convert.ToString(idSeguidor);
                SQLiteCommand comandoSQL =
                    new SQLiteCommand(consultaSQL, conexionSQLite);
                comandoSQL.CommandType = CommandType.Text;
                comandoSQL.Parameters.Add(parametroFecha);
                comandoSQL.Parameters.Add(parametroidSeguidor);
                comandoSQL.ExecuteNonQuery();
                resultado = System.DateTime.Now + " " +
                    "Insertado nuevo seguidor en BD SQLite [" +
                    Convert.ToString(idSeguidor) + "]";
            }
            catch (Exception error)
            {
                resultado = System.DateTime.Now + " " +
                    "Error SQLite insertar seguidor: " +
                    error.Message;
            }
        }


Pero cuando intento ejecutar la siguiente función que debe devolverme el número de registros de una tabla que cumplan una condición (un SELECT con un WHERE), me funciona bien si hay registros, si no hay me devuelve este error:

Referencia a objeto no establecida como instancia de un objeto.

La función:

Código:

        public bool existeSeguidor(long idSeguidor, ref string resultado)
        {
            string consultaSQL =
                "select id from seguidores where id = " +
                Convert.ToString(idSeguidor);
            SQLiteCommand comandoSQL =
                new SQLiteCommand(consultaSQL, conexionSQLite);
            comandoSQL.CommandType = CommandType.Text;
            try
            {
                long numRegistros = (long)comandoSQL.ExecuteScalar();
                comandoSQL.Dispose();
                resultado = System.DateTime.Now + " " +
                    "Ejecutada consulta SQL en SQLite para existe seguidor";
                return (numRegistros > 0);
            }
            catch (Exception error)
            {
                resultado = System.DateTime.Now + " " +
                    "Error SQLite existe seguidor: " + error.Message;
                return false;
            }
        }
MensajePublicado:
Lun Dic 16, 2013 7:10 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Error Referencia a objeto no establecida como instancia Responder citando



Anuncios



El problema lo tienes al usar ExecuteScalar, ten en cuenta que este método debe recibir a la fuerza un valor, si ejecutas:

select id from seguidores where id ...

y no te devuelve registros el resultado será nulo y ExecuteScalar espera algo. Para solucionar el problema es suficiente con que cambies la consulta SQL por:

select count(*) from seguidores where id

De esta forma el ExecuteScalar siempre recibirá un valor, cero si no hay registros que cumplan la condición y el número de registros que cumplan la condición, pero no devolverá nulo y por tanto no te dará error.
MensajePublicado:
Lun Dic 16, 2013 7:18 pm
Top of PageVer perfil de usuario
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: [RESUELTO] Error Referencia a objeto no establecida Responder citando



Anuncios



alonsojpd escribió:
El problema lo tienes al usar ExecuteScalar, ten en cuenta que este método debe recibir a la fuerza un valor, si ejecutas:

select id from seguidores where id ...

y no te devuelve registros el resultado será nulo y ExecuteScalar espera algo. Para solucionar el problema es suficiente con que cambies la consulta SQL por:

select count(*) from seguidores where id

De esta forma el ExecuteScalar siempre recibirá un valor, cero si no hay registros que cumplan la condición y el número de registros que cumplan la condición, pero no devolverá nulo y por tanto no te dará error.


Genial, muchísimas gracias, ahora lo entiendo, lo probé y funciona perfecto. Llevaba días dándole vueltas a esto. Gracias!!!!!!
MensajePublicado:
Lun Dic 16, 2013 7:21 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » VB.Net, C# .Net, Visual Studio .Net  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A