Array
(
)

Validar Registro Antes de Salvar

Jair Souza
   - 10 abr 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 :
#Códigovoid 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 :
#Códigoprivate void BtnSalvar_Click(object sender, EventArgs e)
{
ValidarRegistro(nome,endereco);
{
try
{
if (nomeTextBox.Text != "")
{
this.Validate();
this.locatarioBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.bDBiblioteca2DataSet);

Joel Rodrigues
   - 10 abr 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.

Jair Souza
   - 10 abr 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...

Mateus Pontes
   - 10 abr 2014

Comenta essa linha

#Códigothrow new Exception("Nome ou Endereço já Cadastrados !");

que vai funcionar

Jair Souza
   - 10 abr 2014

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

Pjava
   - 11 abr 2014

Assim:

#Código //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.

Jair Souza
   - 11 abr 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...

Mateus Pontes
   - 12 abr 2014


Citação:
Assim:

#Código //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.

Jair Souza
   - 14 abr 2014

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

Mateus Pontes
   - 14 abr 2014

Seguinte,

Se a condição entrar dentro do seu #Códigoif (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.

Jair Souza
   - 14 mai 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...

#Códigoprivate 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 = "";
}
}

Jair Souza
   - 16 mai 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 .

#Códigoprivate 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();
}
}



Jair Souza
   - 19 mai 2014

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

#Códigoprivate 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);

Jair Souza
   - 30 mai 2014

Resolvido ficou assim :

#Códigoprivate 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.

Jair Souza
   - 30 mai 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 ?

Jair Souza
   - 03 jun 2014

E aí pessoal, alguma dica ?

Jair Souza
   - 04 jun 2014

Ainda não consegui...

Jair Souza
   - 09 jun 2014

Agora consegui, ficou assim :

#Códigoprivate 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();
}
}