PreparedStatement - executeUpdate() dando erro

11 respostas
arnishi

Olá

Estou com um problema que nao estou conseguindo identificar a razao.
Crio uma PreparedStatement e quando vou executar resulta no seguinte erro:
[color=red]java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid call Statement method: {0}[/color]

O fonte do trecho “quebrado” é o que se segue:

[color=darkred]public void[/color][color=blue] atualizaUsuario(String id, String login, String nome, String email){

[/color][color=darkred]try [/color][color=blue]{

String sql = Update usuarios set id = ?,nome = ?,login = ?, email = ? where id = ?;

PreparedStatement ps = connection.prepareStatement(sql);

ps.setString(1, id);

ps.setString(2, nome);

ps.setString(3, login);

ps.setString(4, email);

ps.setString(5, id);

ps.executeUpdate(sql);

} [/color][color=darkred]catch[/color][color=blue] (SQLException e) {

e.printStackTrace();

}

}[/color]

e o stacktrace completo:

[color=red]java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid call Statement method: {0}

at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)

at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)

at com.microsoft.jdbc.base.BasePreparedStatement.executeUpdate(Unknown Source)

at conexao.Conexao.atualizaUsuario(Conexao.java:243)

at pacote.Main.main(Main.java:15)[/color]

11 Respostas

bcartaxo

Nunca usei o SQL Server, mas me pergunto. Como está definido a coluna ID no seu banco? Ela pode ser modificada? Uso o postgres e quando defino um campo como serial, para ser a chave primária, ele cria uma sequencia auto incrementada, que n posso setar o valor diretamente. Veja se existe algum tipo de restrição quanto a isso.

rlsoul

Vc ja adicionou ao classpath o jar do drive sqlserver?
Se sim, posta tb a conexao com o banco.

E outra vc não abriu a conexão com o banco.

public void atualizaUsuario(String id, String login, String nome, String email){

try {
String sql = “Update usuarios set id = ?,nome = ?,login = ?, email = ? where id = ?”;

//------------------------------------------//
// Algo tipo

Connection connection = ConnectionFactory.getConnection();

//------------------------------------------//

PreparedStatement ps = connection.prepareStatement(sql);

ps.setString(1, id);

ps.setString(2, nome);

ps.setString(3, login);

ps.setString(4, email);

ps.setString(5, id);

ps.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

}

}

De uma olhada na apostila FJ21.

Espero ter ajudado.

G

Cara eu não sei não, mas a sua sql está tentando alterar a chave.

não deveria ser algo assim:

String sql = "Update usuarios set nome = ?,login = ?, email = ? where id = ?";

Até +.

erickcellani

gil_email10++

outra coisa… todas essas colunas são do tipo VARCHAR mesmo ??? até o id ???

G

erickcellani:
gil_email10++

outra coisa… todas essas colunas são do tipo VARCHAR mesmo ??? até o id ???

Não entendi :?: :roll:

Mas acho que id deve ser do tipo Integer.

Até +.

arnishi

Cara, tipo, eu pensei nesse lance do varchar tb, mas em outras funçoes ele passa normalmenet. so nessa que ta dando bronca. Antes eu executava essa funçao usando um Statement. quando adaptei pra usar o PreparedStatement emperrou ai. Se fosse um problema de tipo de dado, ele daria um erro de type mismatch nao?

a classe é a seguinte

public class Conexao {
private final String JDBCDriver = “com.microsoft.jdbc.sqlserver.SQLServerDriver”;

private final String DatabaseURL = "jdbc:microsoft:sqlserver://srcsep340:1433;DatabaseName=Agenda";
	
private java.sql.Connection connection = null;

public Conexao() {
	try {
		Class.forName(JDBCDriver);
		connection = DriverManager.getConnection(DatabaseURL,"sa","");
	} catch (SQLException e) {
		e.printStackTrace();
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}
}
[color=olive]//esse pedaço usa o PreparedStatement na mesma tabela sem problema[/color]

public boolean valida(String usuario, String senha) {

try {

String sql = “Select count(*)as count from usuarios where login = ? and senha = ?”;

PreparedStatement statement = connection.prepareStatement(sql);

statement.setString(1,usuario);

statement.setString(2, senha);

ResultSet resultSet = statement.executeQuery();

if (resultSet.next()) {

int count = resultSet.getInt(1);

if (count == 1) {

return true;

}

}

} catch (SQLException e) {

e.printStackTrace();

}

return false;

}

(…)

[color=olive]//esse eh o pedaço com bronca[/color]

public void atualizaUsuario(String id, String login, String nome, String email){

try {

String sql = “Update usuarios set nome = ?,login = ?, email = ? where id = ?”;

PreparedStatement ps = connection.prepareStatement(sql);

ps.setString(1, nome);

ps.setString(2, login);

ps.setString(3, email);

ps.setString(4, id);

ps.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

}

}

(…)

}
arnishi

Obs.
Seguindo a dica do gil_email10 tirei o ID do update (se bem que pela estrutura do programa nao tinha como ser alterada) mas ainda nao funcionou… :frowning:

ramilani12

Seu erro está nesta linha:

ps.executeUpdate(sql);

Vc não precisa passar String SQL de novo vc já preparou neste momento:

PreparedStatement ps = connection.prepareStatement(sql);
G

Porque colocou o sql em ps.executeUpdate, se vc já colocou na 1° linha?

Deixa assim :

ps.executeUpdate();

Acho que agora sim. :lol:

Até +.

erickcellani

gil_email10:

Não entendi :?: :roll:

Mas acho que id deve ser do tipo Integer.

Até +.

bom… naum sei se a parte que vc naum entendeu foi a que eu vou explicar agora… mas todo caso…

o método dele está assim:

public void atualizaUsuario(String id, String login, String nome, String email)

passando uma String para o id, ou seja, no banco, o id deve estar como VARCHAR (pelo menos deveria para passar um id do tipo String)…

mas enfim… e a parte que eu coloquei gil_email10++ é pq eu concordei com o que vc disse

voltando ao problema…

arnishi… como está o seu metodo agora???

posta ai… e posta o StackTrace com a alteração que vc fez!

arnishi

Caramba!! É verdade, por acidente tava tentando compilar novamente.
Que vergonha!! :oops:

Agora funcionou :stuck_out_tongue:
Mas, valeu o apoio pessoal!! abração!

Criado 1 de junho de 2007
Ultima resposta 1 de jun. de 2007
Respostas 11
Participantes 6