Jump to content
nando4

Problema ao carregar dados para as combobox

Recommended Posts

nando4

Boas...

Eu estou a desenvolver o meu software de gestão e tenho uma parte que permite ao utilizador editar os dados de um cliente, e tenho uma combobox onde aparecem todos os clientes e quando o user escolhe um os outros campos(textBoxs e ComboBox) sao preenchidos, e eu quero que quando preencher a comboBox com o tipo de cliente ao lado apareça uma label com a descrição desse tipo de cliente. Ou seja criei o evento cb_tipo_SelectedIndexChanged.

Corre tudo muito bem ate a parte em que tem de aparecer a descricao do tipo de cliente onde me da o erro de que a conexão esta aberta e percisa de ser fechada

O codigo que estou a usar:

private void cb_tipo_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                liga.Open();

                SqlCommand cmd20 = new SqlCommand("SELECT descricao FROM tipo_cliente WHERE nome_tipo_cliente = '"+cb_tipo.Text+"'",liga);
                string desc = (string)cmd20.ExecuteScalar();

                label_desc.Text = desc;

                liga.Close();
            }
            catch (Exception a)
            {
                DialogResult resp = MessageBox.Show("Ocorreu um erro ao carregar os dados.\nDeseja ver detalhes?", "Base de dados", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
                if (resp == System.Windows.Forms.DialogResult.Yes)//SE A RESP FOR YES
                {
                    MessageBox.Show(a.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

Já experimentei apagar o liga.Open() e o liga.Close() mas dava um erro em que ja existia um DataReader associado a esse comando.

Posso não me ter explicado da melhor forma por isso qualquer duvida não hesitem em perguntar.

Cumps

Share this post


Link to post
Share on other sites
cffm

Sei que provavelmente não é a melhor forma, mas podes sempre verificar se já esta open e se já estiver nao a abres novamente.

Algo assim:

if (liga.State != ConnectionState.Open)
            {
                liga.Open();
            }

Share this post


Link to post
Share on other sites
nando4

Deu erro na mesma :x "Já existe um DataReader associado a este comando".

Não sei porque esta a dar erro agora, estou a fazer da mesma forma que fiz nos outros forms.

Cumps

Share this post


Link to post
Share on other sites
Tiago Salgado

O erro diz tudo.

Tens um datareader associado à tua ligação e não fizeste o dispose quando já não precisas dele.

Qual é o código que tens a fazer uma chamada à BD antes do erro?

Share this post


Link to post
Share on other sites
nando4

//ligacao a BD

        static string ligacao_str = "server=Armando-PC" + @"\" + "SQLEXPRESS;Database=teste;User Id=sa;Password=123456";

        SqlConnection liga = new SqlConnection(ligacao_str);

Share this post


Link to post
Share on other sites
nando4

Já pus o dispose (acho que coloquei-o no sitio certo) mas agora da-me este erro:

Aqui está o codigo:

private void cb_nome_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (liga.State != ConnectionState.Open)
            {
                liga.Open();

                //tipo_cliente
                SqlCommand cmd1 = new SqlCommand("SELECT id_tipo_cliente FROM clientes WHERE nome = '" + cb_nome.Text + "'", liga);
                int id_tipo = (int)cmd1.ExecuteScalar();
                SqlCommand cmd2 = new SqlCommand("SELECT nome_tipo_cliente FROM tipo_cliente WHERE id_tipo_cliente = '" + id_tipo + "'", liga);
                string nome_tipo = (string)cmd2.ExecuteScalar();
                //

                //cod_postal
                SqlCommand cmd3 = new SqlCommand("SELECT id_cod_postal FROM clientes WHERE nome = '" + cb_nome.Text + "'", liga);
                int id_cod = (int)cmd3.ExecuteScalar();
                SqlCommand cmd4 = new SqlCommand("SELECT cod_postal FROM cod_postal WHERE id_cod_postal = '" + id_cod + "'", liga);
                string cod_postal = (string)cmd4.ExecuteScalar();
                SqlCommand cmd5 = new SqlCommand("SELECT localidade FROM cod_postal WHERE id_cod_postal = '" + id_cod + "'", liga);
                string local = (string)cmd5.ExecuteScalar();
                //

                SqlCommand cmd = new SqlCommand("SELECT * FROM clientes WHERE nome = '" + cb_nome.Text + "'", liga);
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    tb_nome.Text = Convert.ToString(dr["nome"]);
                    tb_telefonep.Text = dr["telefone_p"].ToString();
                    tb_telefonet.Text = dr["telefone_t"].ToString();
                    tb_telemovelp.Text = dr["telemovel_p"].ToString();
                    tb_telemovelt.Text = dr["telemovel_t"].ToString();
                    tb_email.Text = dr["email"].ToString();
                    tb_fax.Text = dr["fax"].ToString();
                    tb_bi.Text = dr["bi"].ToString();
                    tb_nib.Text = dr["nib"].ToString();
                    tb_nif.Text = dr["nif"].ToString();
                    tb_notas.Text = dr["notas_cliente"].ToString();
                    tb_criado.Text = dr["criado_em"].ToString();
                    cb_tipo.Text = nome_tipo;
                    cb_codpostal.Text = cod_postal;
                    cb_localidade.Text = local;
                    tb_nome.Text.Trim();

                    DateTime dt = new DateTime();
                    dt = Convert.ToDateTime(tb_criado.Text);

                    monthCalendar1.SetDate(dt);
                }
                tb_nome.Text.Trim();
            }
            else
            {
                //faz o mesmo codigo mas sem o liga.Open();
            }
liga.Dispose();

Cumps

Share this post


Link to post
Share on other sites
nando4

Já esta resolvido um colega meu ajudou-me, o problema era que eu tinha isto fora do private void do botao:

//ligacao a BD

string ligacao_str = "server=Armando-PC" + @"\" + "SQLEXPRESS;Database=teste;User Id=sa;Password=123456";

SqlConnection liga = new SqlConnection(ligacao_str);

Obrigado na mesma pela ajuda

Abraço

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.