Usuário com melhor resposta
Abrindo dois comando

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(); } } }
;
Respostas
-
ou seja, aqui:
if (leitor.Read()) { nomeTextBox.Clear(); emailTextBox.Clear(); //AQUI! leitor.Close(); throw new Exception("Código já localizado"); }
- Marcado como Resposta Robson William SilvaModerator quarta-feira, 28 de setembro de 2016 20:10
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.
-
ou seja, aqui:
if (leitor.Read()) { nomeTextBox.Clear(); emailTextBox.Clear(); //AQUI! leitor.Close(); throw new Exception("Código já localizado"); }
- Marcado como Resposta Robson William SilvaModerator quarta-feira, 28 de setembro de 2016 20:10
-