none
Abrindo dois comando RRS feed

  • Pergunta

  • Pessoal estou com um problema aqui estou fazendo um sistema de cadastro de cliente sou iniciante com C# nele faço uma pesquisa para ver se o Cliente já está cadastrado se não ele inserir o novo registro simples, mas quando eu executo esse comando ele fala que já existe um comando associado que deve ser fechado com o devo fazer vou postar meu código, outra coisa  ele mesmo que o cliente esteja cadastrado ele esta cadastrando o que está errado

            private void inserirButton_Click(object sender, EventArgs e)
            {
                //definir conexao
                SqlConnection cn = new SqlConnection(
                    Properties.Settings.Default.conexaoOficina);
    
                //definir comando
                SqlCommand cmd = new SqlCommand("pCliente_SEL_PorNome", cn);
    
                //definir tipo de comando
                cmd.CommandType = CommandType.StoredProcedure;
    
                try
                {
                    cmd.Parameters.AddWithValue("@nome", nomeTextBox.Text.ValidarVazio("Código é obrigatório"));
                    cn.Open();
    
                    //Definir o leitor
                    SqlDataReader leitor = cmd.ExecuteReader();
    
                    //Verificar se retornou o registro
                    if (leitor.Read())
                    {
                        nomeTextBox.Clear();
                        emailTextBox.Clear();
                        throw new Exception("Código já localizado");
    
                    }
                    else
                    {
                        cmd.Dispose();
    
                        //definir comando
                        SqlCommand cmd1 = new SqlCommand("pCliente_INS", cn);
    
                        //definir tipo de comando
                        cmd1.CommandType = CommandType.StoredProcedure;
                        cmd1.Parameters.AddWithValue("@nome", nomeTextBox.Text.ValidarVazio("Nome é obrigatório"));
                        cmd1.Parameters.AddWithValue("@email",emailTextBox.Text.ValidarVazio("E-mail é obrigatório")
                                                                                .ValidarEmail());
                        cmd1.Parameters.AddWithValue("@nasc",nascimDateTimePicker.Value.ValidarData());
    
                        //Recuperar o código gerado na inserção
                        codigoTextBox.Text = cmd1.ExecuteScalar().ToString();
    
                        throw new Exception("Cliente cadastrado com sucesso");
                        
                        //fechar o leitor
                        leitor.Close();
                    }
                }
                catch (Exception ex)
                {
                    mensagemLabel.Text = ex.Message;
                    mensagemLabel.ForeColor = Color.Red;
                }
                finally
                {
                    if (cn.State != ConnectionState.Closed) { cn.Close(); }
                }
            }

    ;

    quarta-feira, 28 de setembro de 2016 14:13

Respostas

Todas as Respostas

  • Claudio, é um problema simples ...

    O Sql NÃO DEIXA você ter mais de uma ação pendente em uma conexão. Sendo assim, se você tiver algum "SqlReader", "SqlCommand", "SqlAdapter" etc aberto você não pode abrir (e executar um outro).

    Digamos que você abriu um "SqlReader". Se você for executar um "SqlCommand", você precisa chamar o "Close()" no "SqlReader" primeiro. Os 2 não podem estar abertos ao mesmo tempo.

    quarta-feira, 28 de setembro de 2016 14:18
  • ou seja, aqui:
     if (leitor.Read())
                    {
                        nomeTextBox.Clear();
                        emailTextBox.Clear();
                        //AQUI!
                        leitor.Close();
                        throw new Exception("Código já localizado");
    
                    }

    quarta-feira, 28 de setembro de 2016 14:20
  • Cara agora funcionou mais estou com um problema como verifico se ele já está cadastrado ele não grava no banco avisa que já está cadstrastrado
    quarta-feira, 28 de setembro de 2016 15:04