C #, Returning a Sql Server query on the Grid View date [closed]

0

I have a bizarre problem, I have a table in the database Sql Server , where it has a bit field, I'm pulling data from this table, which actually is a View .

I make my statement Select , and execute by SqlDataReader ( dr = cmd.ExecuteReader() ), when the value Active is false (coming from C# = 0 ) it returns values , but when it comes to true of C #, it's error (The input string was not in a correct format).

I used this same logic on another screen and it works, it follows the code of screens that does not work:

OBJECT TRANSFER

public class Funcionario : Pessoa
{
    public int id_Func { get; set; }
    public string funcao { get; set; }
    public int id_Gerente { get; set; }
    public bool ativo { get; set; }
    public int id_Loja { get; set; }
}

public class Pessoa
{
    public int id_Pessoa { get; set; }
    public string cpf { get; set; }
    public string nome { get; set; }
    public string sexo { get; set; }

}

BUSINESS

public List<Funcionario> SelecionarFuncionarioPorNome (string nome, bool ativo, int idLoja)
{
        _SQL = @"select 
                Id_Func,NomeFuncionario,Funcao,Cpf,Sexo,id_Gerente,Ativo,idLoja
                from VW_FUNCIONARIO_COMPLETO
                where NomeFuncionario like '%' + @nomefunc + '%' and Ativo = @ativo and idLoja = @idLoja";

        //
        cmd = new SqlCommand();
        cmd.Connection = ConexaoBancoSQLServer.Conectar();

        cmd.Parameters.AddWithValue("@nomefunc", nome);
        cmd.Parameters.AddWithValue("@ativo", ativo);
        cmd.Parameters.AddWithValue("@idLoja", idLoja);
        /*
        cmd.Parameters.Add("@nomefunc", SqlDbType.VarChar, 60).Value = nome;
        cmd.Parameters.Add("@ativo", SqlDbType.Bit, 1).Value = ativo;
        cmd.Parameters.Add("@idLoja", SqlDbType.Int).Value = idLoja;
        */
        cmd.CommandText = _SQL;

        dr = cmd.ExecuteReader();


        List<Funcionario> ListaFuncionarios = new List<Funcionario>();

        while (dr.Read())
        {
            Funcionario func = new Funcionario();

            func.id_Func = int.Parse(dr["Id_Func"].ToString());
            func.nome = dr["NomeFuncionario"].ToString();
            func.funcao = dr["Funcao"].ToString();
            func.cpf = dr["Cpf"].ToString();
            func.sexo = dr["Sexo"].ToString();
            func.id_Gerente = int.Parse(dr["id_Gerente"].ToString());
            func.ativo = Convert.ToBoolean(dr["Ativo"].ToString());
            func.id_Loja = int.Parse(dr["idLoja"].ToString());

            ListaFuncionarios.Add(func);
        }

        return ListaFuncionarios;
}

SCREEN

private void btnPesquisar_Click(object sender, EventArgs e)
{
        try
        {
            bool AtivoDesativo = false;

            if (!rdbDesativado.Checked)
                AtivoDesativo = true;

             if (cmbLoja.Text == "")
                 MessageBox.Show("Escolha uma loja");
            else
                 AtualizarGrid(txtNome.Text, AtivoDesativo, Convert.ToInt32(cmbLoja.SelectedValue));

        }
        catch (Exception ex)
        {

            MessageBox.Show("Erro: " + ex.Message);
        }


}


public void AtualizarGrid(string nome, bool ativo, int idLoja)
{

        List<Funcionario> listaFuncionario = new List<Funcionario>();
        funcionarioNegocio = new FuncionarioNegocio();

        listaFuncionario = funcionarioNegocio.SelecionarFuncionarioPorNome(nome, ativo, idLoja);

        dgvPrincipal.DataSource = null;
        dgvPrincipal.DataSource = listaFuncionario;

        dgvPrincipal.Update();
        dgvPrincipal.Refresh();


}
    
asked by anonymous 27.07.2017 / 02:26

1 answer

2

You have to change your class so that the id_gerente and ativo fields can receive the null value:

public class Funcionario : Pessoa
{
    public int id_Func { get; set; }
    public string funcao { get; set; }
    public int? id_Gerente { get; set; }
    public bool? ativo { get; set; }
    public int id_Loja { get; set; }
}

public class Pessoa
{
    public int id_Pessoa { get; set; }
    public string cpf { get; set; }
    public string nome { get; set; }
    public string sexo { get; set; }

}

and your method should undergo the changes and use the automatic conversion of the SqlDataReader methods:

public List<Funcionario> SelecionarFuncionarioPorNome(string nome, bool ativo, int idLoja)
{
    _SQL = " select Id_Func,NomeFuncionario,Funcao,Cpf,Sexo,id_Gerente,Ativo,idLoja ";
    _SQL += " from VW_FUNCIONARIO_COMPLETO where ";
    _SQL+ = " NomeFuncionario like @nomefunc and Ativo = @ativo and idLoja = @idLoja";

    //
    cmd = new SqlCommand();
    cmd.Connection = ConexaoBancoSQLServer.Conectar();

    cmd.Parameters.AddWithValue("@nomefunc", string.Format("%{0}%", nome));
    cmd.Parameters.AddWithValue("@ativo", ativo);
    cmd.Parameters.AddWithValue("@idLoja", idLoja);        
    cmd.CommandText = _SQL;

    dr = cmd.ExecuteReader();


    List<Funcionario> ListaFuncionarios = new List<Funcionario>();

    while (dr.Read())
    {
        Funcionario func = new Funcionario();

        func.id_Func = dr.dr.GetInt32(0);
        func.nome = dr.GetString(1);                        
        func.funcao = dr.GetString(2);
        func.cpf = dr.GetString(3);
        func.sexo = dr.GetString(4);
        func.id_Gerente = dr.IsDBNull(5) == false ? dr.GetBoolean(5) : false;
        func.ativo = dr.IsDBNull(6) == false ? dr.GetBoolean(6) : false;
        func.id_Loja = dr.dr.GetInt32(7);
        ListaFuncionarios.Add(func);
    }

    return ListaFuncionarios;
}
    
27.07.2017 / 02:54