Validar Registro Antes de Salvar

.NET

10/04/2014

Olá, fiz este código para validar o registro antes de ser salvo, está funcionando para registros novos, mas se faço alteração em um registro já existente, bloqueia dizendo que já existe...
Como posso resolver isto ?
Windows Form C#.

Código :
void ValidarRegistro(string nome, string endereco)

OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca2.mdb");

conexao.Open();

OleDbCommand Comando = new OleDbCommand("SELECT Nome, Endereco From  Locatario WHERE Nome = nome and Endereco = endereco", conexao);

OleDbDataReader reader = null;
                   
reader = comando.ExecuteReader();

try
{
if (reader.Read())
{
	string leitura1 = reader["Nome"].ToString(); 
       string leitura2 = reader["Endereco"].ToString();
throw new Exception("Nome ou Endereço já Cadastrados !");
}
catch (OleDbException exp)
{
exp.Message.ToString();
}
finally
}
conexao.Close();
reader.Close();
}


Chamo o método no botão Salvar :

private void BtnSalvar_Click(object sender, EventArgs e)
{
	ValidarRegistro(nome,endereco);
{
            try
            {
                if (nomeTextBox.Text != "")
                {
                    this.Validate();
                    this.locatarioBindingSource.EndEdit();
                    this.tableAdapterManager.UpdateAll(this.bDBiblioteca2DataSet);
Jair Souza

Jair Souza

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

10/04/2014

Mas se foi assim que você definiu, o que você esperava? Tem ali um throw se a consulta retornar registros, então se o endereço já existir, vai rodar aquele throw.
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Digamos que o João da Silva, já cadastrado com endereço X, muda qualquer outro dado do seu cadastro, não consigo alterar...

Está faltando algo, mas não consegui identificar...
GOSTEI 0
Mateus Moraes

Mateus Moraes

10/04/2014

Comenta essa linha

throw new Exception("Nome ou Endereço já Cadastrados !");


que vai funcionar
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Me desculpe, é o meu primeiro projeto, como assim Comenta ?
GOSTEI 0
Pjava

Pjava

10/04/2014

Assim:

 //throw new Exception("Nome ou Endereço já Cadastrados !");


Ou remova-a. Eu faria isso. Código que não funciona, deve ser removido e não comentado. Comentário assim é lixo. Na minha empresa já teria levado um esculacho daqueles ao comentar código que não serão usados. Comentários somente a nível de informação.
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Concordo plenamente, por isso não entendi "Comenta essa linha", hehehe

Mas sem esta linha não vou ser avisado, quando houver um registro com o "nome" e "endereço" já cadastrados...

GOSTEI 0
Mateus Moraes

Mateus Moraes

10/04/2014

Assim:

 //throw new Exception("Nome ou Endereço já Cadastrados !");


Ou remova-a. Eu faria isso. Código que não funciona, deve ser removido e não comentado. Comentário assim é lixo. Na minha empresa já teria levado um esculacho daqueles ao comentar código que não serão usados. Comentários somente a nível de informação.


Para bom entendedor comenta funcionou remova simples assim.
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Você tem toda razão, não fui um bom entendedor, apareceram outros erros, estou verificando...
GOSTEI 0
Mateus Moraes

Mateus Moraes

10/04/2014

Seguinte,

Se a condição entrar dentro do seu
if (reader.Read())
quer dizer que já existe dessa forma você não precisa lançar uma exceção na sua aplicação, trate como regra de negocio simples.
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Olá, estou retomando esta parte do projeto...e agora depois alguns ajustes está funcionando, mas somente para o PRIMEIRO registro, do segundo em diante não.
O que está errado, que ele não faz a validação do segundo em diante...está deixando salvar mesmo sendo um nome já existente no banco...

private void BtnSalvar_Click(object sender, EventArgs e)
{
tabControl1.Focus();
Restaura_Cor_textBox();

OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca.mdb");

conexao.Open();

OleDbCommand comando = new OleDbCommand("SELECT Nome From  Funcionario", conexao);

OleDbDataReader reader = null;

reader = comando.ExecuteReader();

if (reader.Read())
{
string leitura1 = reader["Nome"].ToString();

conexao.Close();
reader.Close();
try
{
if ((BtnAlterar.Checked == true) || ((leitura1 != nomeTextBox.Text) && (senhaTextBox.Text == ConfSenhatextbox.Text)))
{
this.Validate();
this.funcionarioBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.bDBibliotecaDataSet);
MessageBox.Show("Registro Salvo com Sucesso !", "Salvar", MessageBoxButtons.OK, MessageBoxIcon.Information);
NoMoveReg();
DesabilitaCampos();
this.tabControl1.TabPages.Add(this.tabPage2);
ConfSenhatextbox.ForeColor = Color.Black;
}
if (senhaTextBox.Text != ConfSenhatextbox.Text)
{
MessageBox.Show("Senhas não são Iguais !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
ConfSenhatextbox.ForeColor = Color.Red;
ConfSenhatextbox.Focus();
}
if ((leitura1 == nomeTextBox.Text) && (BtnAlterar.Checked == false))
{
MessageBox.Show("Nome já Cadastrado !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
nomeTextBox.Focus();
}
}

catch (Exception ex)
{
MessageBox.Show("" + ex.Message, "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
DesabilitaCampos();
}
BtnPrimeiro.Enabled = true;
BtnAnterior.Enabled = true;
TBRegAtual.Enabled = true;
BtnProximo.Enabled = true;
BtnUltimo.Enabled = true;
BtnAtualizar.Enabled = true;
BtnExcluir.Enabled = true;
textBox1.Text = "";
}
}
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

E aí pessoal, fiz alguns ajustes no código, e funciona perfeitamente, mas somente com o primeiro registro do BD...não tem jeito...esgotei as minhas tentativas, preciso de ajuda .

private void BtnSalvar_Click(object sender, EventArgs e)
        {
            tabControl1.Focus();
            Restaura_Cor_textBox();

	     try
            {
            OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca.mdb");

            OleDbCommand comando = new OleDbCommand("SELECT Nome,Login  From Funcionario", conexao);

            conexao.Open();

            OleDbDataReader reader = comando.ExecuteReader(CommandBehavior.CloseConnection);

            if (reader.HasRows)
            {
                if (reader.Read())
                {
                    string leitura1 = reader["Nome"].ToString();
                    string leitura2 = reader["Login"].ToString();
			
                        if ((BtnAlterar.Checked == true) || (leitura1 != nomeTextBox.Text) && (leitura2 != loginTextBox.Text) && (senhaTextBox.Text == ConfSenhatextbox.Text))
                        {
                            this.Validate();
                            this.funcionarioBindingSource.EndEdit();
                            this.tableAdapterManager.UpdateAll(this.bDBibliotecaDataSet);
                            MessageBox.Show("Registro Salvo com Sucesso !", "Salvar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            NoMoveReg();
                            DesabilitaCampos();
                            this.tabControl1.TabPages.Add(this.tabPage2);
                            ConfSenhatextbox.ForeColor = Color.Black;
                        }
                        if (senhaTextBox.Text != ConfSenhatextbox.Text)
                        {
                            MessageBox.Show("Senhas não são Iguais !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            ConfSenhatextbox.ForeColor = Color.Red;
                            ConfSenhatextbox.Focus();
                        }
                        if ((BtnAlterar.Checked == false) && (leitura1 == nomeTextBox.Text))
                        {
                            MessageBox.Show("Nome já Cadastrado !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            nomeTextBox.Focus();
                        }
                        if ((BtnAlterar.Checked == false) && (leitura2 == loginTextBox.Text))
                        {
                            MessageBox.Show("Login já Cadastrado !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            loginTextBox.Focus();
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("" + ex.Message, "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.tabControl1.TabPages.Add(this.tabPage2);
                        DesabilitaCampos();
                        NoMoveReg();

                    }
                    BtnPrimeiro.Enabled = true;
                    BtnAnterior.Enabled = true;
                    TBRegAtual.Enabled = true;
                    BtnProximo.Enabled = true;
                    BtnUltimo.Enabled = true;
                    BtnAtualizar.Enabled = true;
                    BtnExcluir.Enabled = true;
                    textBox1.Text = "";
                    BtnAlterar.Checked = false;
                }
                reader.Close();
            }
        }



GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Coloquei um messagebox para ver o que carrega na variavel "leitura" e sempre vem somente o primeiro registro, a primeira linha do grid.

private void BtnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca.mdb");

                OleDbCommand comando = new OleDbCommand("SELECT Nome, Login From Funcionario", conexao);

                conexao.Open();

                OleDbDataReader reader = null;
                reader = comando.ExecuteReader(CommandBehavior.CloseConnection);
                {
                    if (reader.HasRows)
                    {
                        if (reader.Read())
                        {
                                string leitura1 = reader["Nome"].ToString();
                                string leitura2 = reader["Login"].ToString();
                             
                                MessageBox.Show(leitura1);
                                MessageBox.Show(leitura2);
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Resolvido ficou assim :

private void BtnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca.mdb");

                OleDbCommand comando = new OleDbCommand("SELECT Nome, Login FROM Funcionario WHERE Nome = @nome OR Login = @login", conexao);

                comando.Parameters.AddWithValue("@nome", nomeTextBox.Text);
                comando.Parameters.AddWithValue("@login", loginTextBox.Text);

                conexao.Open();

                OleDbDataReader reader = null;

                reader = comando.ExecuteReader(CommandBehavior.CloseConnection);

                if ((reader.HasRows) && (reader.Read())) //se leitor tem linhas e se leitor leu.
                {
                        MessageBox.Show("Nome ou Login já Cadastrado !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        nomeTextBox.Focus();
                        nomeTextBox.ForeColor = Color.Red;
                        loginTextBox.ForeColor = Color.Red;
                    }
                    else if (senhaTextBox.Text != ConfSenhatextbox.Text)
                    {
                    MessageBox.Show("Senhas não são Iguais !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    ConfSenhatextbox.Focus();
                    ConfSenhatextbox.ForeColor = Color.Red;
                }
                else
                {
                    this.Validate();
                    this.funcionarioBindingSource.EndEdit();
                    this.tableAdapterManager.UpdateAll(this.bDBibliotecaDataSet);
                    MessageBox.Show("Registro Salvo com Sucesso !", "Salvar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                  }
		  reader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("" + ex.Message, "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


Mas quero melhorar, informando especificamente quando é o Nome que já existe ou quando é o Login que já existe.
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Mas quero melhorar, informando especificamente quando é o Nome que já existe ou quando é o Login que já existe.

Como fazer isto baseado no código que já tenho ?
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

E aí pessoal, alguma dica ?
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Ainda não consegui...
GOSTEI 0
Jair Souza

Jair Souza

10/04/2014

Agora consegui, ficou assim :

private void BtnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                OleDbConnection conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\BDBiblioteca.mdb");

                OleDbCommand comando = new OleDbCommand("SELECT Nome , Login FROM Funcionario WHERE Nome = @nome OR Login = @login", conexao);

                comando.Parameters.AddWithValue("@nome", nomeTextBox.Text);
                comando.Parameters.AddWithValue("@login", loginTextBox.Text);

                conexao.Open();

                OleDbDataReader reader = null;

                reader = comando.ExecuteReader(CommandBehavior.CloseConnection);

                if ((reader.HasRows) && (reader.Read()) && (BtnAdicionar.Checked == true))
                {
                    if (nomeTextBox.Text == reader["nome"].ToString())
                        {
                            MessageBox.Show("Nome já Cadastrado !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            nomeTextBox.Focus();
                            nomeTextBox.ForeColor = Color.Red;
                            loginTextBox.ForeColor = Color.Black;
                        }
                        else if (loginTextBox.Text == reader["login"].ToString())
                        {
                            MessageBox.Show("Login já Cadastrado !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            loginTextBox.Focus();
                            loginTextBox.ForeColor = Color.Red;
                            nomeTextBox.ForeColor = Color.Black;
                        }
                        }
                        else if (senhaTextBox.Text != ConfSenhatextbox.Text)
                        {
                            MessageBox.Show("Senhas não são Iguais !", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            ConfSenhatextbox.Focus();
                            ConfSenhatextbox.ForeColor = Color.Red;
                        }
                    else
                    {
                        this.Validate();
                        this.funcionarioBindingSource.EndEdit();
                        this.tableAdapterManager.UpdateAll(this.bDBibliotecaDataSet);
                        MessageBox.Show("Registro Salvo com Sucesso !", "Salvar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    reader.Close();
                }
           
            catch (Exception ex)
            {
                MessageBox.Show("" + ex.Message, "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.tabControl1.TabPages.Add(this.tabPage2);
                DesabilitaCampos();
                Restaura_Cor_textBox();
                NoMoveReg();
            }
        }

GOSTEI 0
POSTAR