C sharp - Reader en Null resultado de consulta sql

 
Vista:

Reader en Null resultado de consulta sql

Publicado por Hector Aguilar (1 intervención) el 09/08/2021 18:34:03
Buenos dias he tenido este problema con un reader es una app que conecta varias veces a la base de datos
declaro el reader como null aqui no deberia a ver problema
OdbcDataReader reader2 = null;

odbcCommand.CommandText = String.Format("select * from CAST(SUBSTRING(now(),9,2) AS INT);");
odbcCommand.Connection = conn1;
reader1 = odbcCommand.ExecuteReader();
if (reader1.HasRows)
{
DirectivosCasos = reader1.GetString(0).ToString();

EntradaFecha = Convert.ToInt32(DirectivosCasos);
if (EntradaFecha > 15)
{
reader1.Close();
dEmpleados.Clear();
odbcCommand.CommandText = String.Format("select a.numemp,importe from nomcatalogoempleados a inner join stmpprepanet b on a.numemp= b.numemp where a.numemp in (select b.numemp from stmpprepanet) and tiponomina= '3';"); //Ejecuto este query cuando el if anterior se cumpla
odbcCommand.Connection = conn1;
reader2 = odbcCommand.ExecuteReader();
//string directivo = "Directivo";
//Se empieza a llenar Diccionario y asigna sEmpleados lo que contiene el reader2
if (reader2.HasRows) // pregunto si tiene informacion el reader sobre la consulta
{
if (dgvEmpleadosSinCargos.Visible == false)
{
lblDescripcionGrib.Visible = Visible;
dgvEmpleadosSinCargos.Visible = Visible;
}

dgvEmpleadosSinCargos.Rows.Add("*******************", "********************");
dgvEmpleadosSinCargos.Rows.Add("Directivos", "Importe");

while (reader2.Read())
{
dEmpleados.Add(int.Parse(reader2.GetString(0).ToString()), reader2.GetString(1));
}
reader2.Close(); //aqui cierro el reader2 pero este es el camino bueno cuando se llena el reader , no siempre va a tener informacion ya que un mes puede traer empleados o puede que no


foreach (KeyValuePair<int, string> p in dEmpleados) //lleno un datagrid la aplicacion es muy vieja cuando iniciaba como programador.
{
if (p.Value != " ")
{

//dgvEmpleadosSinCargos.Text += p.Key + p.Value;
dgvEmpleadosSinCargos.Rows.Add(p.Key, p.Value);
}
else
{

// // //dgvEmpleadosSinCargos.Text += p.Key + fechabaja;
dgvEmpleadosSinCargos.Rows.Add(p.Key, "no se por que salio ");
}

}
//foreach(KeyValuePair<int , string> items in dEmpleados){
//dgvEmpleadosSinCargos.Rows.Add(items.Key,items.Value);
//}

}
reader2.Close(); //aqui truena por que aveces no trae informacion y se ejecuto despues del dia 15 del mes
}

}

el programa sigue pero abajo vuelvo a ejecutar otro reader para otra informacion,
Si alguien sabe de algun parcheo sobre una consulta sql favor de ayudar
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Santiago

Reader en Null resultado de consulta sql

Publicado por Santiago (24 intervenciones) el 20/08/2021 18:27:57
Hola:

De momento, yo haría este cambio:

1
2
3
4
5
6
7
8
9
10
11
if (reader1.HasRows)
            {
                DirectivosCasos = reader1.GetString(0).ToString();
 
                EntradaFecha = Convert.ToInt32(DirectivosCasos);
 
// Dado que ya no usas más reader1, lo cerraría aquí.
                reader1.Close();
 
// Ya que si EntradaFecha <=15, el reader1 se queda abierto.
                if (EntradaFecha > 15)

Otra cosa aconsejable (por claridad de código, principalmente) es que yo haría una función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private int GetEntradaFecha()
        {
 
            OdbcCommand odbcCommand = new OdbcCommand();
            OdbcDataReader reader1 = null;
            OdbcConnection conn1 = new OleDbConnection("LA CONEXION");
            string DirectivosCasos;
            int EntradaFecha=-1;
 
            try
            {
 
                odbcCommand.CommandText = String.Format("select * from CAST(SUBSTRING(now(),9,2) AS INT);");
                odbcCommand.Connection = conn1;
                reader1 = odbcCommand.ExecuteReader();
                if (reader1.HasRows)
                {
                    DirectivosCasos = reader1.GetString(0).ToString();
 
                    EntradaFecha = Convert.ToInt32(DirectivosCasos);
 
                }
 
            } catch (Exception ex)
            {
                // Si hay error, devuelvo -1 (o el valor que quieras)
                EntradaFecha = -1;
            }
            finally
            {
                reader1.Close();
            }
 
            return EntradaFecha;
 
    }

Así la consulta a la base de datos, la recuperación de los datos y todo lo que supone, está aislado del código principal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roy
Val: 44
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

Reader en Null resultado de consulta sql

Publicado por Roy (23 intervenciones) el 20/09/2021 19:50:10
Por el formato de su query SELECT, supongo el nombre de su tabla en DB corresponde al numero de mes o numero de año. Sin embargo es importante hacer notar que la funcion SUBSTRING en SQL para el parametro start es base 1 y no base 0 (cero). Ademas, la funcion now() no agrega cero a la izquierda del dia o mes cuando el valor es menor a 9, de manera que, si la fecha es 8 de setiembre, por ejemplo, la funcion now(0 devolvera: 8/9/2021 y si la fecha es 12 de diciembre devolvera 12/12/2021; como vuede ver el lenght (cantidad de caracteres) difiere segun la fecha. De manera que SUBSTRING(now(), 9, 2) no siempre va a devolver el valor correspondiente al mes (que es lo que supongo intenta recuperar).
Por ejemplo, si el valor devuelto por now() es 7/25/2021 12:00:00 AM (el formato para fecha siempre es MM/dd/yyyy hh:mm:ss tt) la funcion SUBSTRING(now(), 9, 2) devolvera: "1 ", toma el 1 de 2021 y el espacio en blanco que le sigue. Al no existir una tabla que tenga por nombre "1 " el Reader viene con valor NULL.
Para subsanar este incoveniente podria almacenar el valor del mes requerido (que corresponde al nombre de la tabla) en una variable local y pasar esta variable al string del query:
1
2
3
4
5
6
7
//toma el mes actual
string nombreTabla = DateTime.Now.Month.ToString();
//para asegurar que siempre el numero de mes sea de 2 caracteres (cero a la izquierda cuando es menor a 10):
if (nombreTabla.Lenght == 1)
    nombreTabla = nombreTabla.PadLeft(2, '0');
//luego se pasa la variable al query SELECT:
odbcCommand.CommandText = String.Format("select * from CAST(" + nombreTabla + " AS INT);");
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Yenier

Reader en Null resultado de consulta sql

Publicado por Yenier (12 intervenciones) el 23/09/2021 18:17:49
En caso de dudas de programacion te las puedo evacuar al correo : [email protected] o a mi whatsapp + 506 8949 9901 ,saludos!
Tengo un ejemplo como el que necesitas!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar