[Resolvido] Digito "Fer" e java entende "Fer + 30 espacos" da erro valor maior que varchar(30)

Dados:

Netbeans 6.9.1
SQL Server 2008

No java:
private String nome;
No banco:
nome varchar(30) not null,

Trecho preenchendo o objeto:

private boolean preencher_objeto_novo(){

        try{
        objPessoa = new Pessoa();
        objPessoa.setNome(jtPes_Nome.getText());

Ocorre quando tento Salvar uma nova “alteração” de uma pessoa
obs: parecido com o método “AlterarPessoaFisica()” o salvar uma “nova pessoa” está ok.

public boolean AlterarPessoaFisica(Pessoa objPessoa, PessoaFisica objPessoaFisica) throws SQLException{
try{
        Conexao conexao = new Conexao();

    PreparedStatement pstmt = conexao.getConexao().prepareStatement(
    " update pessoa set nome = ?, telefone1 = ?, telefone2 = ?, logradouro = ?, numero = ?, complemento = ?, bairro = ?, cep = ?,  cidade = ?, uf = ?, pais = ?, email = ?, tipopessoa = ?  where codigo = ? "+
    " update pessoafisica set cpf = ?, rg = ?, sexo = ?, datanascimento = ?, salario = ?, cargo = ?, escolaridade = ?, doenca = ?, deficiencia = ?, observacoes = ?, tipopessoafisica = ? where codigo = ? ");

    pstmt.setString(1, objPessoa.getNome().toString());
(...)

int registros = pstmt.executeUpdate();
   
    if(registros == 1){
        return true;
    }
    else{
       return false;
        }
}

Desconfio que seja problema nos textfield… Alguém sabe o que pode ser…

Nos “system.out…” aparece o nome e outros campos salvos com vários espaços adiante ( conforme tamanho que determinei no banco de dados. Ex: nome varchar(30) - Salvo “Fernando” e exibe “Fernando + o espaço até dar o tamanho varchar(30) [conforme determinei no banco]”.

Obs: no banco de dados, depois que dou um update, ele limpa os campos e esse mesmo registro que dou um update no java ele funciona normalmente.

Se o campo for char (e não varchar) possa ser que quando salvo no banco e campo está completando os outros espaços em branco. Isso acontece com char, pois sempre o espaço definido na coluna é o espaço a ser ocupado, caso a string passada não tem o espaço total, então a engine do SQL trata de ocupar o restante com espaços em branco.

[code]CREATE TABLE EspacoTeste
(Nome1 VARCHAR(30) NOT NULL
,Nome2 CHAR(30) NOT NULL)

INSERT INTO EspacoTeste VALUES
(‘Teste’, ‘Teste’)

SELECT LEN(Nome1), LEN(Nome2) FROM EspacoTeste[/code]

Verifique se o espaçamento está igual para ambas as colunas no seu banco. Repare que nem todos os bancos se comportam assim, mesmo que o campo seja do tipo char.

Posta ai o getNome e o setNome ^^

debuggando, ve como esta o nome na hora que voce está populando o objeto pessoa, e depois na hora que a consulta fica pronta.

Tenta dando um .trim() na hora que voce está populando o objeto (ou mesmo no setNome) por exemplo:

public void setNome(String n){ nome = n.trim(); }
ou

pessoa.setNome(jtPes_Nome.getText().trim())

ou ainda

public String getNome(){ return nome.trim(); }

Update: Não entendi a ultima parte que voce colocou: no banco de dados, depois que dou um update, ele limpa os campos… (hoje to meio dormente)

Obrigado pela ajuda moçada, mas já joguei trim() em todo lado e desde o início, o erro que dá no banco é esse:

[Microsoft][ODBC SQL Server Driver][SQL Server]Dados de cadeia ou bin?rios seriam truncados.

Acho que isso é porque o textfield está habilitando espaço a mais nos textfields, combobox, etc…

Fiz o update ( que tá no java ) direto no SQL Server e o update roda certinho. Inclusive depois que dou o update do paciente com “código 1” direto no SQL Server, esse mesmo paciente com “código 1” roda certinho quando dou o update pelo java ( método AlterarPessoaFisica() que descrevi acima ). Esse update direto no SQL Server de certa forma corrige o erro que poderia dar no java ( método AlterarPessoaFisica() acima descrito ).

Em outras palavras, quando dou um update no paciente com “código 2” pelo java ( método “AlterarPessoaFisica()” acima descrito ) ele não funciona e dá o erro:

[Microsoft][ODBC SQL Server Driver][SQL Server]Dados de cadeia ou bin?rios seriam truncados.

Alguém pode me ajudar ?

Obrigado a todos

Alguém pode ajudar ?

Oi,

Você viu a dica do Grinvon, pode ser algo assim mesmo.

Se fosse comigo, tentaria mudar o tipo de dado no banco, ou criar a tabela novamente, as vezes faço isso e da certo… :roll:

Da uma olhada aqui…http://support.microsoft.com/kb/883911/pt

cara, no teu Prepared Statement tira o .toString() do getNome(), não é necessário…

Posta aqui a DDL de criação da tabela que estás tentando alterar…

Posta aqui tua classe Pessoa;

Abs []

muda na sua tabela do seu banco de dados esta coluna do tipo: char pra varchar e seja feliz…

pois é… ao que tudo indica já é char, não ???

Se não for… hueheueheueheuehue… todos responderam como se fosse…

Abs []

pois é… ao que tudo indica já é char, não ???

Se não for… hueheueheueheuehue… todos responderam como se fosse…

Abs [][/quote]

Não, é varchar rsrs… :stuck_out_tongue:

no sql VARCHAR, no java String

Trecho da classe “Pessoa”.

Obs: estava sem “.trim()” e tentei colocar p/ teste mas não deu certo por enquanto.

public class Pessoa {

    private int codigo;
    private String nome;
(...)

public Pessoa() {
    }

    public Pessoa(int codigo, String nome, int telefone1, int telefone2, String email, String endereco, String cidade, int cep, String uf, String complemento, String bairro, String pais, String logradouro, String numero, String tipopessoa) {
        this.codigo = codigo;
        this.nome = nome;
(...)

public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }
    public String getNome() {
        return nome.trim();
    }
    public void setNome(String nome) {
        this.nome = nome.trim();

(...)
}

Classe PessoaFisica

public class PessoaFisica extends Pessoa {
    
    private String sexo; 
    private int cpf;
    private int rg;
    private String datanascimento;
(...)

 public PessoaFisica() {
    }

    public PessoaFisica(int codigo, String nome, int telefone1, int telefone2, String email, String endereco, String cidade, int cep, String uf, String complemento, String bairro, String pais, String logradouro, String numero, String tipopessoa, String sexo, int cpf, int rg, String datanascimento, double salario, String cargo, String escolaridade, String doencas, String deficiencia, String observacoes, String tipopessoafisica) {
        super(codigo, nome, telefone1, telefone2, email, endereco, cidade, cep, uf, complemento, bairro, pais, logradouro, numero, tipopessoa);
        this.sexo = sexo;
        this.cpf = cpf;
        this.rg = rg;
        this.datanascimento = datanascimento;
(...)

public PessoaFisica(String sexo, int cpf, int rg, String datanascimento, double salario, String cargo, String escolaridade, String doencas, String deficiencia, String observacoes, String tipopessoafisica) {
        this.sexo = sexo;
        this.cpf = cpf;
        this.rg = rg;
        this.datanascimento = datanascimento;
(...)

public String getSexo() {
        return sexo.trim();
    }

    public void setSexo(String sexo) {
        this.sexo = sexo.trim();
    }

    public int getCpf() {
        return cpf;
    }

    public void setCpf(int cpf) {
        this.cpf = cpf;
    }

    public int getRg() {
        return rg;
    }

    public void setRg(int rg) {
        this.rg = rg;
    }

    public String getDatanascimento() {
        return datanascimento.trim();
    }

    public void setDatanascimento(String datanascimento) {
        this.datanascimento = datanascimento.trim();
    }

No sql


create table pessoa
(
	codigo int not null primary key identity,
	nome varchar(50) not null,
	telefone1 int not null,	
	telefone2 int,
(...)

create table pessoafisica
(
	codigo int primary key,
	cpf int not null,
	rg int not null,
	sexo varchar(20) not null,
	datanascimento date not null,
(...)

Solução do problema:

Alterei os campos da tabela que estavam em “varchar” para “nvarchar” conforme orientação da Microsoft.

alter table pessoa alter column nome nvarchar(50) not null 

Obrigado a todos.

A dica acima do “Anime” foi fundamental.

Obrigado

[quote=fernandom]A dica acima do “Anime” foi fundamental.

Obrigado[/quote]

Legal… :stuck_out_tongue:

Mas é a Anime rsrs…