PreparedStatement atropela constraints

1 resposta
N

Depois de executar a instrução:

int i = preparedStatement.executeUpdate();

As informações são salvas. Mas o estranho é que mesmo se todas as caixas de texto estiverem em branco, mesmo assim a inclusão no banco de dados é feita com sucesso, e todas as colunas da tabela em questão foram setadas com NOT NULL.

Por que isso acontece?

1 Resposta

J

Null é diferente de vazio, se você usa um setString() em um PreparedStatement, e essa String é vazia, ela será setada como vazia no banco, não como NULL.

Seria algo assim:

create table usuarios (id integer auto_increment primary key, nome varchar(50) not null);
insert into usuarios (nome) values (null);
Essa expressão não vai inserir um registro no banco porque o campo "nome" não pode ser nulo. Mas essa vai!
insert into usuarios (nome) values ('');

Então, pra setar um valor como nulo em um PreparedStatement é necessario usar o metodo setNull() e não simplesmente setar uma String vazia com setString().

PreparedStatement stmt = conexao.prepareStatement("insert into usuarios (nome) values (?)");

String nome = "";

if(nome==null||nome.equals("")){
   stmt.setNull(1, Types.VARCHAR);
}else{
   stmt.setString(1, nome);
}

http://java.sun.com/j2se/1.5.0/docs/api/java/sql/PreparedStatement.html#setNull(int,%20int)

Criado 6 de janeiro de 2007
Ultima resposta 6 de jan. de 2007
Respostas 1
Participantes 2