Alterar Cadastro C# com Sql Server 2008
Pessoal,
Sou iniciante em C# e estou desenvolvendo uma aplicação Windows Form para cadastro, com 4 campos, bem básico, gravando os dados no Sql Server 2008. A parte de inserção e exclusão está Ok, mas não estou conseguindo fazer com que o botão "Alterar" funcione, segue o fonte:
Estou usando o Visual Studio 2010 RC, eu debugo a aplicação passo a passo, não da erro algum, mas nao vai, aparentemente roda, mas verifico no Banco e o Campo "Registro" que edito não alterar.
Esse é meu Form, coloco os Campos. O campo "Código" é a, digamos assim, a referencia para alteração no banco.
O Sistema não dá "Try/Catch", aparentemente roda... mas...
... no Banco nada muda...
Alguém pode dar um help...
No aguardo!
private void btnAlterar_Click(object sender, EventArgs e) { try { if (txtCodigo.Text != "") { SqlConnection conn = new SqlConnection(@"Data Source=DAMASCENO-PC\SQLEXPRESS1; Initial Catalog=cadcd;Integrated Security=True;Pooling=False"); SqlCommand comm = new SqlCommand(); comm.Connection = conn; comm.CommandText = "UPDATE cadcd SET TIPO = '" + ddlTipo.Text + "', TITULO = '" + txtTitulo.Text + "', DESCRICAO = '" + richTxtDescr.Text + "WHERE REGISTRO = " + (txtCodigo.Text) + ""; // UPDATE cadcd set TIPO='-DIVERSOS', TITULO='TESTE1', DESCRICAO='TESTE1' where REGISTRO=007 comm.Parameters.AddWithValue("@REGISTRO", txtCodigo.Text); comm.Parameters.AddWithValue("@TIPO", ddlTipo.Text); comm.Parameters.AddWithValue("@TITULO", txtTitulo.Text); comm.Parameters.AddWithValue("@DESCRICAO", richTxtDescr.Text); conn.Open(); conn.Close(); MessageBox.Show("Midia alterada com sucesso!"); } else { MessageBox.Show("Informe o código da mídia"); } }
Bruno Damasceno
Curtidas 0
Respostas
Pedro Maitan
23/06/2010
Antes desse comando : conn.Close();
adiciona isso: conn.ExecuteNonQuery();
adiciona isso: conn.ExecuteNonQuery();
GOSTEI 0
Gustavo Oliveira
23/06/2010
Olá amigo.
Então como diz o Pedro esse comando você tem que chamar.
Observer esse comando porem utilizando o Firebird como SGBD.
[CODE]public static void updateChequeStatus()
[CODE] {
[CODE] try
[CODE] {
[CODE] FbConnection fbConectar = new FbConnection(Class.classBd.ClassStringConexao.stringConexao);
[CODE] fbConectar.Open();
[CODE] FbDataAdapter fbUpdate = new FbDataAdapter("update cheque set idstatus = @idstatus where [CODE]num = '" + Class.ClassCheque.ClassChequeVAR.num + "'", fbConectar);
[CODE] fbUpdate.SelectCommand.Parameters.Clear();
[CODE] fbUpdate.SelectCommand.Parameters.Add("@idstatus", [CODE]Class.ClassCheque.ClassChequeVAR.idstatus);
[CODE] fbUpdate.SelectCommand.ExecuteNonQuery();
[CODE] fbConectar.Close();
[CODE] }
[CODE] catch (FbException exe)
[CODE] {
[CODE] Class.classBd.ClassDbError.MensagemErro(exe.Errors.Count);
[CODE] }
[CODE] }
Observer que a conexao foi aberta antes e o EceuteNomQuery logo apos que o sql recebe os parametros.
espero ter ajudado.
Então como diz o Pedro esse comando você tem que chamar.
Observer esse comando porem utilizando o Firebird como SGBD.
[CODE]public static void updateChequeStatus()
[CODE] {
[CODE] try
[CODE] {
[CODE] FbConnection fbConectar = new FbConnection(Class.classBd.ClassStringConexao.stringConexao);
[CODE] fbConectar.Open();
[CODE] FbDataAdapter fbUpdate = new FbDataAdapter("update cheque set idstatus = @idstatus where [CODE]num = '" + Class.ClassCheque.ClassChequeVAR.num + "'", fbConectar);
[CODE] fbUpdate.SelectCommand.Parameters.Clear();
[CODE] fbUpdate.SelectCommand.Parameters.Add("@idstatus", [CODE]Class.ClassCheque.ClassChequeVAR.idstatus);
[CODE] fbUpdate.SelectCommand.ExecuteNonQuery();
[CODE] fbConectar.Close();
[CODE] }
[CODE] catch (FbException exe)
[CODE] {
[CODE] Class.classBd.ClassDbError.MensagemErro(exe.Errors.Count);
[CODE] }
[CODE] }
Observer que a conexao foi aberta antes e o EceuteNomQuery logo apos que o sql recebe os parametros.
espero ter ajudado.
GOSTEI 0
Bruno Damasceno
23/06/2010
Obrigado pessoal.
A noite vou testar o que foi passado e dou um parecer aqui.
Att.
GOSTEI 0
Bruno Damasceno
23/06/2010
Pessoal,
Coloquei
O programa não compila, da o seguinte erro "Error 1 'System.Data.SqlClient.SqlConnection' does not contain a definition for 'ExecuteNonQuery' and no extension method 'ExecuteNonQuery' accepting a first argument of type 'System.Data.SqlClient.SqlConnection' could be found (are you missing a using directive or an assembly reference?) C:\Users\Damasceno\documents\visual studio 2010\Projects\cadastroCD\cadastroCD\Form1.cs 192 26 cadastroCD"
Fiz um teste, coloquei o seguinte código:
Só que logo após o "comm.ExecuteNonQuery();" o compilador vai para o Catch. Não sei onde está o erro...
Nos outros botões o código...
... Funciona de boa.
Alguma outra alternativa?
Obrigado pela ajuda.
conn.Open(); conn.ExecuteNonQuery(); conn.Close();
Fiz um teste, coloquei o seguinte código:
conn.Open(); comm.ExecuteNonQuery(); conn.Close();
conn.Open(); comm.ExecuteNonQuery(); conn.Close();
GOSTEI 0
Erickson Nascimento
23/06/2010
Qual a mensagem que aparece no Catch, ou seja, qual o erro que dá ?
GOSTEI 0
Bruno Damasceno
23/06/2010
Qual a mensagem que aparece no Catch, ou seja, qual o erro que dá ?
catch { MessageBox.Show("Erro na alteração do cadastro", "Mensagem do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Warning); }
Ou meu fonte de Botão "Alterar" está assim:
private void btnAlterar_Click(object sender, EventArgs e) { try { if (txtCodigo.Text != "") { SqlConnection conn = new SqlConnection(@"Data Source=DAMASCENO-PC\SQLEXPRESS1; Initial Catalog=cadcd;Integrated Security=True;Pooling=False"); SqlCommand comm = new SqlCommand(); comm.Connection = conn; comm.CommandText = "UPDATE cadcd SET TIPO = '" + ddlTipo.Text + "', TITULO = '" + txtTitulo.Text + "', DESCRICAO = '" + richTxtDescr.Text + "WHERE REGISTRO = " + (txtCodigo.Text) + ""; // UPDATE cadcd set TIPO='-DIVERSOS', TITULO='TESTE1', DESCRICAO='TESTE1' where REGISTRO=007 comm.Parameters.AddWithValue("@REGISTRO", txtCodigo.Text); comm.Parameters.AddWithValue("@TIPO", ddlTipo.Text); comm.Parameters.AddWithValue("@TITULO", txtTitulo.Text); comm.Parameters.AddWithValue("@DESCRICAO", richTxtDescr.Text); conn.Open(); comm.ExecuteNonQuery(); conn.Close(); MessageBox.Show("Midia alterada com sucesso!"); } else { MessageBox.Show("Informe o código da mídia"); } } catch { MessageBox.Show("Erro na alteração do cadastro", "Mensagem do Sistema", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }
GOSTEI 0
Gustavo Oliveira
23/06/2010
o seu cod esta assim.
tenta colocar assim.
NO FIREBIRD quando se trata de string nesta situação ficaria assim.
"WHERE REGISTRO = " + (txtCodigo.Text) + "";
tenta colocar assim.
"WHERE REGISTRO = '" + txtCodigo.Text + "'";
NO FIREBIRD quando se trata de string nesta situação ficaria assim.
GOSTEI 0
Bruno Damasceno
23/06/2010
Pessoal, deu certo!
Era um erro na instrução UPDATE, após o "richTxtDescr.Text +" faltavam as aspas de fechamento.
Valeu a todos!
Até a próxima dúvida. rsrs
comm.CommandText = "UPDATE cadcd SET TIPO = '" + ddlTipo.Text + "', TITULO = '" + txtTitulo.Text + "', DESCRICAO = '" + richTxtDescr.Text + "' " + "WHERE REGISTRO = " + (txtCodigo.Text) + "";
GOSTEI 0
Juscélio Reis
23/06/2010
Uma pergunta, pq vc utiliza:
comm.Parameters.AddWithValue("@REGISTRO", txtCodigo.Text);comm.Parameters.AddWithValue("@TIPO", ddlTipo.Text);comm.Parameters.AddWithValue("@TITULO", txtTitulo.Text);comm.Parameters.AddWithValue("@DESCRICAO", richTxtDescr.Text);
se vc utiliza concatenação de string
comm.CommandText = "UPDATE cadcd SET TIPO = '" + ddlTipo.Text + "', TITULO = '" + txtTitulo.Text + "', DESCRICAO = '" + richTxtDescr.Text +"WHERE REGISTRO = " + (txtCodigo.Text) + "";
Uma boa pratica é utilizar:comm.CommandText = "UPDATE cadcd SET TIPO = @TIPO, TITULO = @TITULO, DESCRICAO = @DESCRICAO WHERE REGISTRO = @REGISTRO";comm.Parameters.AddWithValue("@REGISTRO", txtCodigo.Text);comm.Parameters.AddWithValue("@TIPO", ddlTipo.Text);comm.Parameters.AddWithValue("@TITULO", txtTitulo.Text);comm.Parameters.AddWithValue("@DESCRICAO", richTxtDescr.Text);Percebe a diferença? Isso ajuda até na questão de segurança. Da outra forma, vc tem codigo q tecnicamente não esta utilizando.
comm.Parameters.AddWithValue("@REGISTRO", txtCodigo.Text);comm.Parameters.AddWithValue("@TIPO", ddlTipo.Text);comm.Parameters.AddWithValue("@TITULO", txtTitulo.Text);comm.Parameters.AddWithValue("@DESCRICAO", richTxtDescr.Text);
se vc utiliza concatenação de string
comm.CommandText = "UPDATE cadcd SET TIPO = '" + ddlTipo.Text + "', TITULO = '" + txtTitulo.Text + "', DESCRICAO = '" + richTxtDescr.Text +"WHERE REGISTRO = " + (txtCodigo.Text) + "";
Uma boa pratica é utilizar:comm.CommandText = "UPDATE cadcd SET TIPO = @TIPO, TITULO = @TITULO, DESCRICAO = @DESCRICAO WHERE REGISTRO = @REGISTRO";comm.Parameters.AddWithValue("@REGISTRO", txtCodigo.Text);comm.Parameters.AddWithValue("@TIPO", ddlTipo.Text);comm.Parameters.AddWithValue("@TITULO", txtTitulo.Text);comm.Parameters.AddWithValue("@DESCRICAO", richTxtDescr.Text);Percebe a diferença? Isso ajuda até na questão de segurança. Da outra forma, vc tem codigo q tecnicamente não esta utilizando.
GOSTEI 0
Bruno Damasceno
23/06/2010
Obrigado pela dica Amigo, por ser iniciante em Desenvolvimento .Net ainda não tenho essas manhas de boa prática.... muito obrigado.
GOSTEI 0
Netasper
23/06/2010
Crie um metodo tipo este:
public DataTable BuscarDownloads(string palavraChave)
{
StringBuilder sql = new StringBuilder();
sql.Append("select * from downloads where cod_turma is null and ");
sql.Append("nom_download like '%%' ");
sql.Append("order by nom_download");
cmd.CommandText = String.Format(sql.ToString(), palavraChave);
acesso.ExecuteQuery(ref cmd, ref resultado);
return resultado;
}
e chame-o de seu Form
[]s
public DataTable BuscarDownloads(string palavraChave)
{
StringBuilder sql = new StringBuilder();
sql.Append("select * from downloads where cod_turma is null and ");
sql.Append("nom_download like '%%' ");
sql.Append("order by nom_download");
cmd.CommandText = String.Format(sql.ToString(), palavraChave);
acesso.ExecuteQuery(ref cmd, ref resultado);
return resultado;
}
e chame-o de seu Form
[]s
GOSTEI 0