RESOLVIDO: Problemas para inserir no BD

Meus caros, estou tentando inserir programas e seriais num arquivo de Microsoft Access, através do seguinte código:

public int inserirPrograma(){
		if(this.programa == null){
			return -1;
		}
        try {
        	PreparedStatement stmtInsere = conn.prepareStatement("INSERT INTO programa VALUES (null,?,?,?)");
    		stmtInsere.setString(2, programa.getName());
                stmtInsere.setString(3, programa.getSerial());
                stmtInsere.setString(4, programa.getCaminho());
			return stmtInsere.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return -1;
		}
	}

Eis a clsse de conexão:

[code]
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Conexao {

 public static Connection getConexao(){
	 try{
		 Driver d = (Driver)Class.forName  
		          ("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();  
		 Connection c = DriverManager.getConnection  
		          ("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=src/bd/ListPrograms.mdb");  
		 return c;  
	 }catch(SQLException e){
		 e.printStackTrace();
         System.err.println("Erro de Conexão!");
         return null;
	 }catch(ClassNotFoundException c){
            c.printStackTrace();
            System.err.println("Classe Não Encontrada!");
            return null;
     } catch (InstantiationException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return null;
 }

}[/code]

Toda vez q tento adicionar é retornada a seguinte exceção:
Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 3
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter(JdbcOdbcPreparedStatement.java:1023)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setChar(JdbcOdbcPreparedStatement.java:3057)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString(JdbcOdbcPreparedStatement.java:766)
at persistent.ProgramaDAO.inserirPrograma(ProgramaDAO.java:31)

O erro aponta para essa linha: stmtInsere.setString(4, programa.getCaminho());

POr favor se alguém puder me dar uma luz…

try {
      PreparedStatement stmtInsere = conn.prepareStatement("INSERT INTO programa VALUES (null,?,?,?)");
      stmtInsere.setString(2, programa.getName()); // mude para 1
      stmtInsere.setString(3, programa.getSerial()); // mude para 2
      stmtInsere.setString(4, programa.getCaminho()); // mude para 3
      return stmtInsere.executeUpdate();
} catch (SQLException e) {
      e.printStackTrace();
      return -1;
}

conn.prepareStatement(“INSERT INTO programa VALUES (null,?,?,?)”); = 3 ???.

Espero ter ajudado.

Amigão, eu tentei oq vc sugeriu e retornou o seguinte:
java.sql.SQLException: [Microsoft][Driver ODBC para Microsoft Access] Você tentou atribuir o valor Null a uma variável que não é do tipo de dados Variant.

Eu começo pelo 2 pq a primeira entrada é auto-increment.

è como o henriquejhc Falou.

stmtInsere.setString(2, programa.getName()); // mude para 1
stmtInsere.setString(3, programa.getSerial()); // mude para 2
stmtInsere.setString(4, programa.getCaminho()); // mude para 3

PreparedStatement stmtInsere = conn.prepareStatement(“INSERT INTO programa VALUES (null,?,?,?)”);
Não importa qnts parametros sua query tenha, o setString() substitui as “?” pela ordem.

Se seu statemet fosse algo assim
PreparedStatement stmtInsere = conn.prepareStatement(“INSERT INTO programa VALUES (null,null,null,?)”);
vc só teria UM setString() e ele seria assim: setString(1,“valor”);

PreparedStatement stmtInsere = conn.prepareStatement(“INSERT INTO programa VALUES (null,?,null,?)”);
setString(1,“valor x”);
setString(2,“valor y”);

E esse seu outro erro, é pq provavelmente pq não aceita null pra int, troca o null por qq numero.

Ok, vou testar.

Realmente funcionou quando eu coloquei um numero no local do null, mas aí surge outra dúvida, como eu faço para inserir como auto increment? pois ali insiro a id.

Bom, com o access eu não sei, nos bancos que uso (mysql, MSsql) eu o campo com Auto-Increment, e mesmo que no INSERT eu coloquei qq numero, ele n leva em consideração o numero e segue a ordem do AI.

Tenta isso pra ver se vai:

O seu ta assim.
“INSERT INTO programa (campo_id,campo_x,campo_y,campo_z) VALUES (null,?,?,?)”

Retira expliciamente o nome do campo referente ao ID. (e retira tb no values, ficando os 3 valores e sem o id.)
“INSERT INTO programa (campo_x,campo_y,campo_z) VALUES (?,?,?)”

Pior q só falta isso pro para o programa funcionar sem problemas.

Vlw Vash, tinha feito a sua dica errado, agora fio.