Asunto: Error Referencia a objeto no establecida como instancia C#
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:
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;
}
}
Publicado:
Lun Dic 16, 2013 7:10 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Error Referencia a objeto no establecida como instancia
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.
Publicado:
Lun Dic 16, 2013 7:18 pm
varios Magnífico usuario
Registrado: Oct 10, 2006 Mensajes: 2092
Asunto: [RESUELTO] Error Referencia a objeto no establecida
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!!!!!!
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