SQL error

13 respostas
G

Pessoal boa tarde, numa aplicação que estou desenvolvendo está aparecendo em tempo de execução a mensagem já tentei de tudo e não consigo identificar o que está errado, que puder ajudar ageradeço.

GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -104
Token Unknown - line 1, char 84
’,’

o sql é esse:

qry = " insert into BANCOS ("
      		+ "CODIGO, BANCO, AGENCIA, CONTA, LIMITE, CHEQUE) values ("
	        + "    " + tfCodigo .getText() + "'"
		    + " , '" + tfBanco  .getText() + "'"
		    + " , '" + tfAgencia.getText() + "'"
		    + " , '" + tfConta  .getText() + "'"
		    + " , '" + tfLimite .getText() + "'"
  		    + " , '" + tfCheque .getText() + "')";

obrigado

13 Respostas

H

E ae!

Acho que está faltando um ’ antes da passagem tfCodigo .getText()…
Ficando assim

qry = " insert into BANCOS ("  
    + "CODIGO, BANCO, AGENCIA, CONTA, LIMITE, CHEQUE) values ("  
    + "    '" + tfCodigo .getText() + "'"  
    + " , '" + tfBanco  .getText() + "'"  
    + " , '" + tfAgencia.getText() + "'"  
    + " , '" + tfConta  .getText() + "'"  
    + " , '" + tfLimite .getText() + "'"  
    + " , '" + tfCheque .getText() + "')";

valeu!

G

haamilton, obrigado era isso mesmo…

fiaux

Melhore isso usando prepared statement.

Rodrigo_Rocha_de_Mor

Melhore isso usando prepared statement. [2]

G

Pessoal, segui a orientação e usei o PreparedStatement, mas está me aparecendo esse erro na execução, se puder me ajudar agradeço estou engatinhando no java… obrigado.

pelo erro parece que faltou inicializar alguma coisa… mas não consigo descobrir…

--------------------Configuration: Controle - JDK version 1.6.0_03  - --------------------

Exception in thread AWT-EventQueue-0 java.lang.NullPointerException

at Cad001.gravaRegistro(Cad001.java:100)

at Cad001.btGravar_actionPerformed(Cad001.java:86)

at formPadrao02$2.actionPerformed(formPadrao02.java:106)

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:6038)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)

at java.awt.Component.processEvent(Component.java:5803)

at java.awt.Container.processEvent(Container.java:2058)

at java.awt.Component.dispatchEventImpl(Component.java:4410)

at java.awt.Container.dispatchEventImpl(Container.java:2116)

at java.awt.Component.dispatchEvent(Component.java:4240)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)

at java.awt.Container.dispatchEventImpl(Container.java:2102)

at java.awt.Window.dispatchEventImpl(Window.java:2429)

at java.awt.Component.dispatchEvent(Component.java:4240)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Process interrupted by user.

/**
 * @(#)Cad001.java
 *
 *
 * @author 
 * @version 1.00 2008/9/2
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.sql.*;

public class Cad001 extends formPadrao02 {
	
	private JLabel lbCodigo;
	private JLabel lbBanco;
	private JLabel lbAgencia;
	private JLabel lbConta;
	private JLabel lbLimite;
	private JLabel lbCheque;

	private JTextField tfCodigo;
	private JTextField tfBanco;
	private JTextField tfAgencia;
	private JTextField tfConta;
	private JTextField tfLimite;
	private JTextField tfCheque;
	
	private Connection conn;

    public Cad001() {

    	this.setSize(new Dimension(400, 390));
    	this.setLocationRelativeTo(null);
    	setTitle("Cadastro de Contas Correntes");
    	
    	lbCodigo  = new JLabel("Código");    	
    	lbBanco   = new JLabel("Banco");
    	lbAgencia = new JLabel("Agência");
    	lbConta   = new JLabel("Conta");
    	lbLimite  = new JLabel("Limite");
    	lbCheque  = new JLabel("Cheque");    	
    	
    	tfCodigo  = new JTextField();
    	tfBanco   = new JTextField();
    	tfAgencia = new JTextField();
    	tfConta   = new JTextField();
    	tfLimite  = new JTextField();
    	tfCheque  = new JTextField();    	
    	
    	// limita a digitação de caracteres
        tfCodigo  .setDocument(new MaiusculaLtda(06,true));        
        tfBanco   .setDocument(new MaiusculaLtda(03,true));        
        tfAgencia .setDocument(new MaiusculaLtda(10,true));        
        tfConta   .setDocument(new MaiusculaLtda(10,true));        
        tfLimite  .setDocument(new MaiusculaLtda(15,true));        
        tfCheque  .setDocument(new MaiusculaLtda(10,true));                	
        	
        // parâmetros..: coluna, linha, comprimento, altura
    	super.addComponent(folderA, lbCodigo,   60, 38,60,18);
    	super.addComponent(folderA, lbBanco,    60, 68,60,18);
    	super.addComponent(folderA, lbAgencia,  60, 98,60,18);
    	super.addComponent(folderA, lbConta,    60,128,60,18);
    	super.addComponent(folderA, lbLimite,   60,158,60,18); 
    	super.addComponent(folderA, lbCheque,   60,188,60,18);     		
    	
    	super.addComponent(folderA, tfCodigo,  120, 38,60,23);
    	super.addComponent(folderA, tfBanco,   120, 68,60,23);    	    	
    	super.addComponent(folderA, tfAgencia, 120, 98,60,23);    	    	
    	super.addComponent(folderA, tfConta,   120,128,60,23);    	
    	super.addComponent(folderA, tfLimite,  120,158,60,23);  
    	super.addComponent(folderA, tfCheque,  120,188,60,23);      		

    }
    
    public static void main (String[] args) {
    	formPadrao02 obj_Cad001 = new Cad001();
    	obj_Cad001.setVisible(true);
	}
	
	
	public void btGravar_actionPerformed(ActionEvent e)
	{
		gravaRegistro();
	}


	public void gravaRegistro() {
		ConBd firebird = new ConBd();
		firebird.setDRV(driver);
		firebird.setURL(url);
		firebird.setUserName(userName);
		firebird.setPassword(password);
		firebird.conecta();
	  
		try {
    		qry = "INSERT INTO bancos VALUES(NULL,?,?)";
[b]//ESSA LINHA ABAIXO SERIA A LINHA 100[/b]
			PreparedStatement ps = conn.prepareStatement(qry);
			ps.setString(1,tfCodigo.getText());
			ps.setString(2,tfBanco.getText());
			ps.executeUpdate();
			ps.close();
		}
		catch(SQLException sqlex) {
			mensagemErro(sqlex.getMessage());
		}
			  
		//firebird.exeQuery(qry);
		firebird.desconecta();

	}
	
	private void mensagemErro(String msg) {
		JOptionPane.showMessageDialog(
		  null,
	    msg,
	    "Erro",
	    JOptionPane.ERROR_MESSAGE);
	}
	
}
Rodrigo_Rocha_de_Mor

qry = “INSERT INTO bancos VALUES(NULL, ?, ?)”;

Esse NULL está errado!

Vc está passando uma String com o valor NULL e não um valor vazio…

Se vc não quer inserir em uma determinada coluna, referencie em sua query apenas as usadas, por exemplo:

qry = “INSERT INTO bancos(codigo, nome) VALUES(?,?)”;

Entendeu?!

[]'s

G

Rodrigo, obrigado pela dica, troquei o SQL para:
qry = “INSERT INTO bancos(codigo, banco, agencia, conta, limite, cheque) VALUES(?,?,?,?,?,?)”;

mas o erro continua o mesmo ainda… não consigo encontrá-lo…

Rodrigo_Rocha_de_Mor

ggero:
Rodrigo, obrigado pela dica, troquei o SQL para:
qry = “INSERT INTO bancos(codigo, banco, agencia, conta, limite, cheque) VALUES(?,?,?,?,?,?)”;

mas o erro continua o mesmo ainda… não consigo encontrá-lo…

Vei, olhei com mais calma o código e realmente, o erro não está simplesmente na query!

Vc tem uma classe chamada ConBd e um objeto da mesma (firebird) que faz a conexão com o banco de dados…
Porém em nenhum momento vc retorna uma conexão…
Vc tenta obter uma conexão do objeto conn que não foi inicializado e como é uma variável de classe é inicializada null por padrão!
Exatamente por isso está dando erro nessa linha! Seu objeto conn é null
Para solucionar isso, faça com que o método .conecta() da classe ConBd retorne um objeto de java.util.Connection, em seguida faça conn receber esse retorno, como segue:
conn = firebird.conecta()
Aí sim, com seu objeto conexão instanciado vc pode usar o método conn.prepareStatement(sql)!

Qualquer dúvida estamos aí!

[]'s

G

Rodrigo, desculpe não entendi bem a questão:


Para solucionar isso, faça com que o método .conecta() da classe ConBd retorne um objeto de java.util.Connection, em seguida faça conn receber esse retorno, como segue:

Estou postando a classe ConBd vc pode dar uma olhada?, desculpe é que não consigo mesmo..... e obrigado.

[/code]
import javax.swing.*;
import java.sql.*;

public class ConBd {
private String DRV;
private String url;
private String userName;
private String password;
Connection conn;
private Statement st;

public boolean conecta() {
boolean result = true;
try {
Class.forName(DRV);
conn = DriverManager.getConnection(url, userName, password);
JOptionPane.showMessageDialog(null,"Conectou !!!");
}
catch(ClassNotFoundException erroClass) {
mensagemErro(erroClass.getMessage());
result = false;
}
catch(SQLException erroSQL) {
mensagemErro(erroSQL.getMessage());
result = false;
}
return result;
}

public void desconecta() {
boolean result = true;
try {
conn.close();
}
catch(SQLException erroSQL) {
mensagemErro(erroSQL.getMessage());
result = false;
}
}

public int regCount(String qry) {
int result = 0;
try {
st = conn.createStatement();
ResultSet rs = st.executeQuery(qry);
rs.next();
result = rs.getInt(1);
st.close();
}
catch(SQLException sqlex) {
mensagemErro(sqlex.getMessage());
}
return result;
}

public int exeQuery(String qry) {
int result = 0;
try {
st = conn.createStatement();
result = st.executeUpdate(qry);
st.close();
}
catch(SQLException sqlex) {
mensagemErro(sqlex.getMessage());
}
return result;
}

public String getColumn(String qry) {
String result = "";
try {
st = conn.createStatement();
ResultSet rs = st.executeQuery(qry);
rs.next();
result = "" + rs.getString(1);
st.close();
}
catch(SQLException sqlex) {
mensagemErro(sqlex.getMessage());
}
return result;
}

public void getColumn(String qry, String[] reg) {
try {
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(qry);
rs.next();
for (int i = 1; i <= reg.length; i++)
reg[i-1] = "" + rs.getString(i);
st.close();
}
catch(SQLException sqlex) {
mensagemErro(sqlex.getMessage());
}
}

public void getColumn(String qry, String[][] reg, int regs) {
try {
int lin = 0;
st = conn.createStatement();
ResultSet rs = st.executeQuery(qry);
while (rs.next()) {
for (int i = 0; i < regs; i++) {
reg[lin][i] = "" + rs.getString(i+1);
}
lin++;
}
}
catch(SQLException sqlex) {
mensagemErro(sqlex.getMessage());
}
}

public void setDRV(String valor) {
DRV = valor;
}

public void setURL(String valor) {
url = valor;
}

public void setUserName(String valor) {
userName = valor;
}

public void setPassword(String valor) {
password = valor;
}

private void mensagemErro(String msg) {
JOptionPane.showMessageDialog(
null,
msg,
"Erro",
JOptionPane.ERROR_MESSAGE);
}
}
[code]

G

Agora sim…

import javax.swing.*;
import java.sql.*;

public class ConBd {
	private String DRV;
	private String url;
	private String userName;
	private String password;
	Connection conn;
	private Statement st;

	public boolean conecta() {
	  boolean result = true;
	  try {
	    Class.forName(DRV);
	    conn = DriverManager.getConnection(url, userName, password);
		JOptionPane.showMessageDialog(null,"Conectou !!!");	    
	  } 
	  catch(ClassNotFoundException erroClass) {
	  	mensagemErro(erroClass.getMessage());
	  	result = false;
	  }
	  catch(SQLException erroSQL) {
	    mensagemErro(erroSQL.getMessage());
	    result = false;
	  }
	  return result;
	}

	public void desconecta() {
		boolean result = true;
		try {
			conn.close();
		}
		catch(SQLException erroSQL) {
			mensagemErro(erroSQL.getMessage());
			result = false;
		}
	}

	public int regCount(String qry) {
		int result = 0;
		try {
			st = conn.createStatement();
			ResultSet rs = st.executeQuery(qry);
			rs.next();
			result = rs.getInt(1);
			st.close();
		}
		catch(SQLException sqlex) {
			mensagemErro(sqlex.getMessage());
		}
	    return result;
	}

	public int exeQuery(String qry) {
		int result = 0;
		try {
			st = conn.createStatement();
			result = st.executeUpdate(qry);
			st.close();
		}
		catch(SQLException sqlex) {
			mensagemErro(sqlex.getMessage());
		}
		return result;
	}

	public String getColumn(String qry) {
		String result = "";
		try {
			st = conn.createStatement();
			ResultSet rs = st.executeQuery(qry);
			rs.next();
			result = "" + rs.getString(1);
	      st.close();
		}
		catch(SQLException sqlex) {
			mensagemErro(sqlex.getMessage());
		}
		return result;
	}

	public void getColumn(String qry, String[] reg) {
		try {
			Statement st = conn.createStatement();
			ResultSet rs = st.executeQuery(qry);
			rs.next();
			for (int i = 1; i <= reg.length; i++)
				reg[i-1] = "" + rs.getString(i);
			st.close();
		}
		catch(SQLException sqlex) {
			mensagemErro(sqlex.getMessage());
	  }
	}

	public void getColumn(String qry, String[][] reg, int regs) {
		try {
			int lin = 0;
			st = conn.createStatement();
			ResultSet rs = st.executeQuery(qry);
			while (rs.next()) {
				for (int i = 0; i < regs; i++) {
					reg[lin][i] = "" + rs.getString(i+1);
				}
				lin++;
			}  
		}
		catch(SQLException sqlex) {
			mensagemErro(sqlex.getMessage());
		}        
	}

	public void setDRV(String valor) {
		DRV = valor;
	}

	public void setURL(String valor) {
		url = valor;
	}

	public void setUserName(String valor) {
		userName = valor;
	}

	public void setPassword(String valor) {
		password = valor;
	}

	private void mensagemErro(String msg) {
		JOptionPane.showMessageDialog(
		  null,
	    msg,
	    "Erro",
	    JOptionPane.ERROR_MESSAGE);
	}
}
Rodrigo_Rocha_de_Mor

Meu amigo, na tua classe ConBd vc tem um objeto conn da classe java.sql.Connection certo?!
No metodo .conecta() vc cria uma conexão, porém ela não está visível para toda a tua aplicação, apenas para a classe ConBd…
Então ao invés do método .conecta() retornar um boolean, faça com que ele retorne esse objeto Connection criado entendeu?!
E lá na tua outra classe faça:

Connection conn = firebird.conecta();

Dessa forma vc estará passando a conexão criada em ConBd para a classe Cad001!

Entendeu?!

[]'s

G

blz Rodrigo entendi, obrigado pela atenção.

Rodrigo_Rocha_de_Mor

\o/

Estamos aí fii!

[]'s

Criado 4 de setembro de 2008
Ultima resposta 12 de set. de 2008
Respostas 13
Participantes 4