none
Botão salvar em c# erro...o que devo fazer? RRS feed

  • Discussão Geral

  • Olá pessoal!
    **Estou usando Visual Studio 2015 e SQL Server 2014**
    Sou novo na programação em geral... estou tentando desenvolver um sistema para controle de cliente, estoque e venda. No form para cadastro de clientes estou com um problema aparece este erro ao clicar no botão salvar, segue imagem **Não posso postar imagem até que verifiquem minha acc AFF!!**:

    Mas o erro diz o seguinte:

    SqlException was unhandled

    An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

    Additional information: String or binary data would be truncated.

    The statement has been terminated.


    Segue todo o código para revisão...

      private void btnSAVE_Click_1(object sender, EventArgs e)
            {
                SqlConnection conexao = new SqlConnection(@"Data Source=MATEUSANDRADE\SQLSERVER;Initial Catalog=INFINITY;Integrated Security=True");
    
                SqlCommand comm = new SqlCommand();
                comm.Connection = conexao;
                conexao.Open();
                comm.CommandText = "INSERT INTO dbo.CLIENTE (NOME, CPF, RG, DATA_NASC, DATA_EXP, PAI, NATURALIDADE, NASC_PAI, MAE, NASC_MAE, CONJUGE, NASC_CONJ, CPF_CONJ, TEL_FIXO, CEL_1, CEL_2, CEL_3, CEL_1_CONJ, CEL_2_CONJ, CEL_3_CONJ, EMAIL, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, CEP, PONTO_REF, EMPRESA, CNPJ, TEL_EMP, FUNCAO, DATA_ADMISSAO, SALARIO)"
                       + "VALUES ('" + textBoxNOME.Text + "','" + maskedTextBoxCPF.Text + "','" + textBoxRG.Text + "','" + maskedTextBoxDATANASC + "','" + maskedTextBoxDATAEXP.Text + "','" + textBoxPAI.Text + "','" + textBoxNATURALIDADE.Text + "','" + maskedTextBoxNASCPAI.Text + "','" + textBoxMAE.Text + "','" + maskedTextBoxNASCMAE.Text + "','" + textBoxCONJUGE.Text + "','" + maskedTextBoxNASCCONJ.Text + "','" + maskedTextBoxCPFCONJ.Text + "','" + maskedTextBoxTELFIXO.Text + "','" + maskedTextBoxCEL1.Text + "','" + maskedTextBoxCEL2.Text + "','" + maskedTextBoxCEL3.Text + "','" + maskedTextBoxCEL1CONJ.Text + "','" + maskedTextBoxCEL2CONJ.Text + "','" + maskedTextBoxCEL3CONJ.Text + "','" + textBoxEMAIL.Text + "','" + textBoxENDERECO.Text + "','" + textBoxNUMERO.Text + "','" + textBoxBAIRRO.Text + "','" + textBoxCIDADE.Text + "','" + comboBoxUF.Text + "','" + maskedTextBoxCEP.Text + "','" + textBoxPONTOREF.Text + "','" + textBoxEMPRESA.Text + "','" + maskedTextBoxCNPJ.Text + "','" + maskedTextBoxTELEMP.Text + "','" + textBoxFUNCAO.Text + "','" + maskedTextBoxADMISSAO.Text + "','" + maskedTextBoxSALARIO.Text + "')";
                comm.Parameters.AddWithValue("@NOME", textBoxNOME.Text);
                comm.Parameters.AddWithValue("@CPF", maskedTextBoxCPF.Text);
                comm.Parameters.AddWithValue("@RG", textBoxRG.Text);
                comm.Parameters.AddWithValue("@DATA_NASC", maskedTextBoxDATANASC.Text);
                comm.Parameters.AddWithValue("@DATA_EXP", maskedTextBoxDATAEXP.Text);
                comm.Parameters.AddWithValue("@PAI", textBoxPAI.Text);
                comm.Parameters.AddWithValue("@NATURALIDADE", textBoxNATURALIDADE.Text);
                comm.Parameters.AddWithValue("@NASC_PAI", maskedTextBoxNASCPAI.Text);
                comm.Parameters.AddWithValue("@MAE", textBoxMAE.Text);
                comm.Parameters.AddWithValue("@NASC_MAE", maskedTextBoxNASCMAE.Text);
                comm.Parameters.AddWithValue("@CONJUGE", textBoxCONJUGE.Text);
                comm.Parameters.AddWithValue("@NASC_CONJ", maskedTextBoxNASCCONJ.Text);
                comm.Parameters.AddWithValue("@CPF_CONJ", maskedTextBoxCPFCONJ.Text);
                comm.Parameters.AddWithValue("@TEL_FIXO", maskedTextBoxTELFIXO.Text);
                comm.Parameters.AddWithValue("@CEL_1", maskedTextBoxCEL1.Text);
                comm.Parameters.AddWithValue("@CEL_2", maskedTextBoxCEL2.Text);
                comm.Parameters.AddWithValue("@CEL_3", maskedTextBoxCEL3.Text);
                comm.Parameters.AddWithValue("@CEL_1_CONJ", maskedTextBoxCEL1CONJ.Text);
                comm.Parameters.AddWithValue("@CEL_2_CONJ", maskedTextBoxCEL2CONJ.Text);
                comm.Parameters.AddWithValue("@CEL_3_CONJ", maskedTextBoxCEL3CONJ.Text);
                comm.Parameters.AddWithValue("@EMAIL", textBoxEMAIL.Text);
                comm.Parameters.AddWithValue("@ENDERECO", textBoxENDERECO.Text);
                comm.Parameters.AddWithValue("@NUMERO", textBoxNUMERO.Text);
                comm.Parameters.AddWithValue("@BAIRRO", textBoxBAIRRO.Text);
                comm.Parameters.AddWithValue("@CIDADE", textBoxCIDADE.Text);
                comm.Parameters.AddWithValue("@UF", comboBoxUF.Text);
                comm.Parameters.AddWithValue("@CEP", maskedTextBoxCEP.Text);
                comm.Parameters.AddWithValue("@PONTO_REF", textBoxPONTOREF.Text);
                comm.Parameters.AddWithValue("@EMPRESA", textBoxEMPRESA.Text);
                comm.Parameters.AddWithValue("@CNPJ", maskedTextBoxCNPJ.Text);
                comm.Parameters.AddWithValue("@TEL_EMP", maskedTextBoxTELEMP.Text);
                comm.Parameters.AddWithValue("@FUNCAO", textBoxFUNCAO.Text);
                comm.Parameters.AddWithValue("@DATA_ADMISSAO", maskedTextBoxADMISSAO.Text);
                comm.Parameters.AddWithValue("@SALARIO", maskedTextBoxSALARIO.Text);
    
                
                comm.ExecuteNonQuery();
                
    
                MessageBox.Show("Cadastro realizado com sucesso!", "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Information);
    
                conexao.Close();
    
            }
        }
    }
    Espero que vocês possam me ajudar, obrigado!


    sexta-feira, 12 de fevereiro de 2016 20:15

Todas as Respostas

  • Boa tarde.

    Mateus, verifique o tamanho máximo dos teus campos do banco de dados.

    Provavelmente uma ou mais colunas possuem um tamanho máximo menor que o valor que tu estás passando.

    Ex.: Coluna NOME é um VARCHAR(10) e tu estás tentando gravar uma string de 15 caracteres.


    Att., Rafael Simor

    sexta-feira, 12 de fevereiro de 2016 20:30
  • Provavelmente é o que o SimorC mencionou. Mas percebi que você possui campos de Data também.

    ex:

    comm.Parameters.AddWithValue("@NASC_MAE", Convert.ToDateTime(maskedTextBoxNASCMAE.Text));

    O mesmo vale para outros tipos de dados que não são String/VARCHAR

    sexta-feira, 12 de fevereiro de 2016 20:55
  • Olá Rafael.
    Eu fiz assim no banco de dados, não sei se está correto pois não tenho experiência alguma em programação, banco de dados e etc, por favor verifica se está correto..
    CREATE TABLE CLIENTE (
    NOME VARCHAR (100),
    CPF VARCHAR (14) UNIQUE,
    RG VARCHAR (25),
    DATA_NASC VARCHAR (10),
    DATA_EXP VARCHAR (10),
    PAI VARCHAR (100),
    NATURALIDADE VARCHAR (50),
    NASC_PAI VARCHAR (10),
    MAE VARCHAR (100),
    NASC_MAE VARCHAR (10),
    CONJUGE VARCHAR (100),
    NASC_CONJ VARCHAR (10),
    CPF_CONJ VARCHAR (14),
    TEL_FIXO VARCHAR (14),
    CEL_1 VARCHAR (16),
    CEL_2 VARCHAR (16),
    CEL_3 VARCHAR (16),
    CEL_1_CONJ VARCHAR (16),
    CEL_2_CONJ VARCHAR (16),
    CEL_3_CONJ VARCHAR (16),
    EMAIL VARCHAR (100),
    ENDERECO VARCHAR (100),
    NUMERO VARCHAR (10),
    BAIRRO VARCHAR (50),
    CIDADE VARCHAR (50),
    UF VARCHAR (2),
    CEP VARCHAR (9),
    PONTO_REF VARCHAR (100),
    EMPRESA VARCHAR (50),
    CNPJ VARCHAR (18),
    TEL_EMP VARCHAR (14),
    FUNCAO VARCHAR (30),
    DATA_ADMISSAO vARCHAR (10),
    SALARIO MONEY
    );
    Esse sistema que estou tentando fazer é pra uma loja que tenho... quero algo simples mas que funcione..
    sexta-feira, 12 de fevereiro de 2016 21:24
  • No caso todos os campos que são data terei que usar esse comando "Convert.ToDateTime("..."));" ?
    sexta-feira, 12 de fevereiro de 2016 21:25
  • Mateus, o ideal seria deixar cada campo com seus tipos corretos; campos de data deixar como Date ou DateTime, Numero deixar como Integer e por aí vai (aliás, antes de gravar no banco nas colunas Date ou DateTime, lembre-se deste padrão: "yyyy-MM-dd HH:mm:ss", pois este é o formato necessário para se gravar no banco de dados).

    Desta forma, acredito que o erro seja exatamente o que eu disse: tu estás tentando gravar um valor maior que o tamanho do campo. Ex.:

    UF é um VARCHAR(2), se tu tentar gravar "Rio Grande do Sul", ele irá estourar o erro.


    Att., Rafael Simor

    sexta-feira, 12 de fevereiro de 2016 21:30
  • Como o SimorC disse, o recomendado é utilizar os tipos corretos, então:

    • modifique os tipos de dados no DB como o SimorC explicou;
    • depois converta seus dados no C# para os tipos correspondentes (lá nos parâmetros, como o Convert.ToDateTime...);
    • Não permita o input de dados maiores que os limites definidos no DB (como o SimorC explicou)
    • executar a Query .

    Isso vai facilitar a manipulação de dados, filtros e até a performance das consultas. Além de ajudar a descobrir o erro no debug do Visual Studio.

    sexta-feira, 12 de fevereiro de 2016 22:20
  • Entendo. Farei as modificações necessárias e logo mais postarei o resultado. Me desejem sorte hehe

    Rafael se um campo no db é NOME VARCHAR (100) por exemplo, no visual studio devo colocar o limite de caracteres para 100 também?
    sexta-feira, 12 de fevereiro de 2016 22:25
  • Ok, estou modificando o banco de dados e logo modificarei no visual studio Cesar, valeusão! :D Logo logo posto o resultado :)
    sexta-feira, 12 de fevereiro de 2016 22:33
  • Boa noite Mateus,

    Esse erro é gerado quando você tenta inserir um conteúdo no banco de dados maior do que o campo permite. Por exemplo, você tem um campo VARCHAR(10) e o conteúdo que você tenta inserir é "MATEUS DE ANDRADE", será gerado o erro pois o conteúdo ultrapassou o limite estipulado na criação do campo.

    Para resolver o problema, você pode optar duas soluções:

    1. Inserir um conteúdo que respeite o tamanho máximo de caracteres do campo no banco de dados;
    2. Aumentar o tamanho máximo de caracteres do campo, da seguinte maneira:
    ALTER TABLE Nome_Tabela
    ALTER COLUMN Nome_Campo Tipo_De_Dado(Novo_Tamanho)

    Abs.

    Bruno Destro


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/

    sexta-feira, 12 de fevereiro de 2016 23:30
  • Entendo. Farei as modificações necessárias e logo mais postarei o resultado. Me desejem sorte hehe

    Rafael se um campo no db é NOME VARCHAR (100) por exemplo, no visual studio devo colocar o limite de caracteres para 100 também?

    Exatamente.
    sábado, 13 de fevereiro de 2016 00:15
  • Rafael Simor, Cesar Cassiano, Bruno Destro  devo agradecer a todos vocês pelas dicas, finalmente consegui. Com todas as dicas que me foram dadas parei pra pensar e com calma consegui localizar os principais erros que estavam em meu próprio DB, vi também que não estava utilizando os parâmetros corretos no visual studio:

                comm.Parameters.AddWithValue("@NOME", Convert.ToString(textBoxNOME.Text));
    
                comm.Parameters.AddWithValue("@DATA_NASC", Convert.ToDateTime(maskedTextBoxDATANASC.Text));
    
    Nas maskedTextBox -CPF, TELEFONE, não consegui convertê-las em INT decidi colocá-las como VARCHAR no banco de dados e usar:
                comm.Parameters.AddWithValue("@CPF", Convert.ToString(maskedTextBoxCPF.Text));
    
    Acessei também o w3 Schools para obter mais informações à respeito de banco de dados.

    Me ajudem por favor a converter as masked de cpf e telefone em INT ficarei muito agradecido (se ainda possuírem um pouco de paciência com esse noob aqui hehe), obrigado pessoal!!

    domingo, 14 de fevereiro de 2016 01:39
  • Boa noite, Mateus.

    Fico feliz que tenha conseguido.

    Assim, INTEGER são números inteiros; não vejo motivos para deixar o telefone e CPF como Int, deixe como VARCHAR mesmo.

    Normalmente INTEGERS são dados que serão manipulados em algum momento, porém o CPF só serias manipulado antes da inserção (em tese), para realizar a validação; após, ele ficará gravado em banco e em teoria não precisará ser mais manipulado.


    Att., Rafael Simor

    domingo, 14 de fevereiro de 2016 01:43
  • Hm, entendi! Rafael muitíssimo obrigado :D
    domingo, 14 de fevereiro de 2016 01:54
  • Bem, vejo alguns erros de principiante na sua estrutura de dados relativos à tipagem de dados. O principal é o campo para datas sendo usado como varchar. Isso vai fazer a sua procura por dados um pesadelo e muito pouco confiável. O que me deixa contente é você estar usando parametrização para suas queries. É a maneira correta de ser feito então, já é meio caminho andado! Tenho uma série de vídeos no youtube onde mostro basicamente o que está fazendo mas com uso de boas práticas de programação incluindo a orientação à objeto. Sugiro que dê uma olhada nela, pois você já está à meio caminho de desenvolver aplicações de nível profissional!
    domingo, 14 de fevereiro de 2016 20:38
  • Kerplunk você poderia me passar algum contato, email, skype ou whatsapp? Estou inscrito no seu canal agora, estou tendo um erro cabuloso nos campos de data, não consigo salvar no SQL SERVER... já editei os tipos de dados no sql porém não consigo converter o que é digitado na maskedTextBox para salvar no sql....
    domingo, 14 de fevereiro de 2016 23:47
  • Bem, não costumo passar contatos, mas quero te ajudar. Qual a excpetion que você está tendo?
    segunda-feira, 15 de fevereiro de 2016 22:43