Então, ta dando um erro de sintaxe, porém quando pego a SQL gerada e jogo no servidor ela roda normalmente…
Segue códigos.
SQL:
DELETE FROM permissaoperfil
WHERE idPerfil = 4 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 11 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 8 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 13 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 12 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 9 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 10 ;
ERRO:
com.mysql.jdbc.JDBC4PreparedStatement@10f0625: DELETE FROM permissaoperfil
WHERE idPerfil = 4 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 11 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 8 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 13 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 12 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 9 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 10 ;
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 11 ; INSERT’ at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1356)
at br.com.bb.proagro.modelo.PerfisDAO.cadastraPermissoes(PerfisDAO.java:75)
at br.com.bb.proagro.controle.PerfisControle.salvarPermissoes(PerfisControle.java:36)
at br.com.bb.proagro.visao.TelaPerfis.salvar(TelaPerfis.java:87)
at br.com.bb.proagro.visao.TelaPerfis.botaoSalvarActionPerformed(TelaPerfis.java:262)
at br.com.bb.proagro.visao.TelaPerfis.access$300(TelaPerfis.java:31)
at br.com.bb.proagro.visao.TelaPerfis$4.actionPerformed(TelaPerfis.java:170)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Erro ao inserir no banco de dados: [Ljava.lang.StackTraceElement;@1bc4ec8
com.mysql.jdbc.JDBC4PreparedStatement@10f0625: DELETE FROM permissaoperfil
WHERE idPerfil = 4 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 11 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 8 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 13 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 12 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 9 ; INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 10 ;
CONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 35 segundos)
CODIGO:
public boolean cadastraPermissoes(ArrayList<PermissoesVO> arrPermissoes, Integer idPerfil){
PreparedStatement pst = null;
//CADSATRANDO AS PERMISSOES
StringBuilder sql = new StringBuilder();
//Fazendo a Sql para permissoes, pra ir tudo numa soh
//apagando todos para colocar novamente
sql.append(" DELETE FROM `permissaoperfil` " +
" WHERE idPerfil = "+idPerfil+" ; ");
for (PermissoesVO permissoesVO : arrPermissoes) {
sql.append(" INSERT INTO `permissaoperfil` SET " +
" `idPerfil` = "+idPerfil+", " +
" `idPermissao` = "+permissoesVO.getId()+" ; ");
}
try {
pst = this.getConnection().prepareStatement(sql.toString());
System.out.println(pst.toString());
pst.execute();
// pst.close();
return true;
// }catch (SQLException eSQL) {
// eSQL.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
System.err.println("Erro ao inserir no banco de dados: " + e.getStackTrace()+ "\n"+pst.toString());
}
return false;
}
Alguém sabe?
O SQL pode estar certo mas o uso está incorreto!
Você deve criar um Statement para o delete e outro para o insert!
[quote=thiago.correa]O SQL pode estar certo mas o uso está incorreto!
Você deve criar um Statement para o delete e outro para o insert! [/quote]
Mudei, ele conseguiu deletar, que é a primeira parte, mas pra inserir deu erro:
CODIGO FICOU ASSIM:
[code]public boolean cadastraPermissoes(ArrayList arrPermissoes, Integer idPerfil){
PreparedStatement pst = null;
PreparedStatement pst2 = null;
//CADSATRANDO AS PERMISSOES
StringBuilder sql = new StringBuilder();
StringBuilder sql2 = new StringBuilder();
//Fazendo a Sql para permissoes, pra ir tudo numa soh
//apagando todos para colocar novamente
sql.append(" DELETE FROM `permissaoperfil` " +
" WHERE idPerfil = "+idPerfil+" ; ");
for (PermissoesVO permissoesVO : arrPermissoes) {
sql2.append(" INSERT INTO `permissaoperfil` SET " +
" `idPerfil` = "+idPerfil+", " +
" `idPermissao` = "+permissoesVO.getId()+" ; ");
}
try {
pst = this.getConnection().prepareStatement(sql.toString());
pst.execute();
pst2 = this.getConnection().prepareStatement(sql2.toString());
pst2.execute();
// pst.close();
return true;
}catch (SQLException eSQL) {
eSQL.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
System.err.println("Erro ao inserir no banco de dados: " + e.getStackTrace()+ “\n”+pst.toString());
}
return false;
} [/code]
ERRO ASSIM:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO permissaoperfil
SET idPerfil
= 4, idPermissao
= 8 ; INSERT ’ at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1356)
at br.com.bb.proagro.modelo.PerfisDAO.cadastraPermissoes(PerfisDAO.java:79)
at br.com.bb.proagro.controle.PerfisControle.salvarPermissoes(PerfisControle.java:36)
at br.com.bb.proagro.visao.TelaPerfis.salvar(TelaPerfis.java:87)
at br.com.bb.proagro.visao.TelaPerfis.botaoSalvarActionPerformed(TelaPerfis.java:262)
at br.com.bb.proagro.visao.TelaPerfis.access$3(TelaPerfis.java:261)
at br.com.bb.proagro.visao.TelaPerfis$4.actionPerformed(TelaPerfis.java:170)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
EITA ![:frowning: :frowning:](https://www.guj.com.br/images/emoji/twitter/frowning.png?v=9)
Retire o ponto-e-vírgula e as apas simples do insert/delete, da tua instrução SQL, isso não é necessário!
ao invés de:
String sql = "insert into tabela 'coluna' = " + varialvel + ";";
use
String sql = "insert into tabela coluna = " + varialvel;
Outra coisa, se você quiser inserir em batch (mais de um registro em uma única vez) você deve usar o método addBatch e executeBatch da classe Statement (ou PreparedStatement)
Sugestão de melhoria user o PreparedStatement o seu código ficaria assim
sql.append(" DELETE FROM permissaoperfil WHERE idPerfil = ?");
pst = this.getConnection().prepareStatement(sql.toString());
pst.setString(1, idPerfil);
pst.execute();
[quote=thiago.correa]Retire o ponto-e-vírgula e as apas simples do insert/delete, da tua instrução SQL, isso não é necessário!
ao invés de:
String sql = "insert into tabela 'coluna' = " + varialvel + ";";
use
String sql = "insert into tabela coluna = " + varialvel;
Outra coisa, se você quiser inserir em batch (mais de um registro em uma única vez) você deve usar o método addBatch e executeBatch da classe Statement (ou PreparedStatement)
Sugestão de melhoria user o PreparedStatement o seu código ficaria assim
sql.append(" DELETE FROM permissaoperfil WHERE idPerfil = ?");
pst = this.getConnection().prepareStatement(sql.toString());
pst.setString(1, idPerfil);
pst.execute();
[/quote]
GRannndee!!
Se eu soubesse disso antes teria poupado tempo nosso!!
Ficou asism o código, pra quem precisar!!
[code] public boolean cadastraPermissoes(ArrayList arrPermissoes, Integer idPerfil){
PreparedStatement pst = null;
PreparedStatement pst2 = null;
//DELETANDO AS PERMISSOES PARA CADASTRAR DNOVO
try {
String sql = " DELETE FROM permissaoperfil WHERE idPerfil = ? ; ";
pst = this.getConnection().prepareStatement(sql.toString());
pst.setInt(1, idPerfil);
pst.execute();
} catch (SQLException e) {
System.err.println("Erro ao deletar no banco de dados: " + e.getStackTrace()+ "\n"+pst.toString());
e.printStackTrace();
}
//INSERINDO AS PERMISSOES
try {
String sql2 = " INSERT INTO permissaoperfil SET " +
" idPerfil = ?, " +
" idPermissao = ? ; ";
pst2 = this.getConnection().prepareStatement(sql2.toString());
for (PermissoesVO permissoesVO : arrPermissoes) {
pst2.setInt(1, idPerfil);
pst2.setInt(2, permissoesVO.getId());
pst2.addBatch();
}
pst2.executeBatch();
} catch (SQLException e) {
System.err.println("Erro ao inserir no banco de dados: " + e.getStackTrace()+ "\n"+pst.toString());
e.printStackTrace();
}
return true;
} [/code]
Abraço, e obrigado pela ajuda
Caso o sistema seja alvo de estudo e ou teste, favor desconsiderar essa outra sugestão:
Sugiro você usar somente e.printStackTrace() para efeito de estudos (ou utilizar uma biblioteca de logging)
ou, você pegar a exceção e relançá-la para que o sistema trate e informe o usuário do erro
[quote=thiago.correa]Caso o sistema seja alvo de estudo e ou teste, favor desconsiderar essa outra sugestão:
Sugiro você usar somente e.printStackTrace() para efeito de estudos (ou utilizar uma biblioteca de logging)
ou, você pegar a exceção e relançá-la para que o sistema trate e informe o usuário do erro[/quote]
Eu trato tudo com Throws na interface de controle, depois que finalizar o programa eu retiro todos…
Sei que o certo era usar uma biblioteca para isso, mas assim acho qeu vai ficar correto também…
Obrigado