[resolvido]continuar inserindo ignorando exceção

8 respostas
xandevieira

Boa tarde, fiz uma breve busca no google e no forum mas não encontrei uma solução.
Estou lendo uma planilha do excel criando os objetos e inserindo numa tabela do banco de dados. Estou utilizando jdbc, firebird.
O problema que uma das colunas é chave primaria da tabela e pode haver repetição na planiha, o banco esta retornando excção, como continuar inserindo e ignorar a exceção?

Estou fazendo assim:

public void leituraINC(String arquivo) throws BiffException, IOException, SQLException{
		Workbook workbook = Workbook.getWorkbook(new File(arquivo));
		PreparedStatement stmt = null; 
		try {
			Sheet sheet = workbook.getSheet(0);
			int linhas = sheet.getRows();
			System.out.println("Iniciando a leitura da planilha XLS:");
			ContaContabilDB contaContabilDB = new ContaContabilDB();
			String sql = "insert into eincContaContabil (cdContabil, cdEmpresa, deContabil, flAgrupa, flExportaCCusto, cdContabilAux) values (?, ?, ?, ?, ?, ?)";
			stmt = DataSource.getConexao().prepareStatement(sql);
			for(int i = 0; i < linhas; i++){
				Cell cell1 = sheet.getCell(0, i);
				Cell cell2 = sheet.getCell(1, i);
				Cell cell3 = sheet.getCell(2, i);
				Cell cell4 = sheet.getCell(3, i);
				Cell cell5 = sheet.getCell(4, i);
				
				String content1 = cell1.getContents();
				String content2 = cell2.getContents();
				String content3 = cell3.getContents();
				String content4 = cell4.getContents();
				String content5 = cell5.getContents();
				
				if("ANALITICA".equals(content5)){
					System.out.println("Inserindo linha "+i);
					ContaContabil contaContabil = new ContaContabil();
					contaContabil.setCdEmpresa(1);
					contaContabil.setCdContabil(content1);
					contaContabil.setCdContabilAux(content2);
					contaContabil.setDeContabil(content3.trim());
					contaContabil.setFlAgrupa("N");
					contaContabil.setFlExportaCCusto("N");
					contaContabilDB.insert(contaContabil, stmt);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			System.out.println("Importação concluida");
			workbook.close();
		}
	}

meu insert

	public void insert(ContaContabil contaContabil, PreparedStatement stmt) throws SQLException {
		try {
			stmt.setString(1, contaContabil.getCdContabil());
			stmt.setInt   (2, contaContabil.getCdEmpresa());
			stmt.setString(3, contaContabil.getDeContabil());
			stmt.setString(4, contaContabil.getFlAgrupa());
			stmt.setString(5, contaContabil.getFlExportaCCusto());
			stmt.setString(6, contaContabil.getCdContabilAux());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

8 Respostas

rodrigo.bossini
avsouza:
Boa tarde, fiz uma breve busca no google e no forum mas não encontrei uma solução. Estou lendo uma planilha do excel criando os objetos e inserindo numa tabela do banco de dados. Estou utilizando jdbc, firebird. O problema que uma das colunas é chave primaria da tabela e pode haver repetição na planiha, o banco esta retornando excção, como continuar inserindo e ignorar a exceção? Estou fazendo assim:
public void leituraINC(String arquivo) throws BiffException, IOException, SQLException{
		Workbook workbook = Workbook.getWorkbook(new File(arquivo));
		PreparedStatement stmt = null; 
		try {
			Sheet sheet = workbook.getSheet(0);
			int linhas = sheet.getRows();
			System.out.println("Iniciando a leitura da planilha XLS:");
			ContaContabilDB contaContabilDB = new ContaContabilDB();
			String sql = "insert into eincContaContabil (cdContabil, cdEmpresa, deContabil, flAgrupa, flExportaCCusto, cdContabilAux) values (?, ?, ?, ?, ?, ?)";
			stmt = DataSource.getConexao().prepareStatement(sql);
			for(int i = 0; i < linhas; i++){
				Cell cell1 = sheet.getCell(0, i);
				Cell cell2 = sheet.getCell(1, i);
				Cell cell3 = sheet.getCell(2, i);
				Cell cell4 = sheet.getCell(3, i);
				Cell cell5 = sheet.getCell(4, i);
				
				String content1 = cell1.getContents();
				String content2 = cell2.getContents();
				String content3 = cell3.getContents();
				String content4 = cell4.getContents();
				String content5 = cell5.getContents();
				
				if("ANALITICA".equals(content5)){
					System.out.println("Inserindo linha "+i);
					ContaContabil contaContabil = new ContaContabil();
					contaContabil.setCdEmpresa(1);
					contaContabil.setCdContabil(content1);
					contaContabil.setCdContabilAux(content2);
					contaContabil.setDeContabil(content3.trim());
					contaContabil.setFlAgrupa("N");
					contaContabil.setFlExportaCCusto("N");
					contaContabilDB.insert(contaContabil, stmt);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			System.out.println("Importação concluida");
			workbook.close();
		}
	}

meu insert

	public void insert(ContaContabil contaContabil, PreparedStatement stmt) throws SQLException {
		try {
			stmt.setString(1, contaContabil.getCdContabil());
			stmt.setInt   (2, contaContabil.getCdEmpresa());
			stmt.setString(3, contaContabil.getDeContabil());
			stmt.setString(4, contaContabil.getFlAgrupa());
			stmt.setString(5, contaContabil.getFlExportaCCusto());
			stmt.setString(6, contaContabil.getCdContabilAux());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

Você nunca vai conseguir inserir valores repetidos num campo que seja chave primária. Nesse caso creio que vc terá que retirar essa constraint da coluna pra que o banco não gere a exceção.

Felagund

Para fazer ele continuar inserindo vc tem que diminuir seu try e catch

coleque ele somente na parte contaContabilDB.insert(contaContabil, stmt);

assim se der um erro para inserir ele vai continuar mesmo assim.

[]'s

Jose111

Uma solução é você criar uma chave primária que você mesmo incremente para que não ocorra essa duplicação.
Se você estiver usando o ibexpert é relativamente simples fazer isso, através de uma trigger e um generator.

Essa de pular a exceção me parece uma péssima pratica de programação ( quando li o titulo do tópico senti cheiro de POG :lol: ) , você precisa mesmo que sua chave primária seja um valor da planilha que você está lendo? Senão acredito que a minha sugestão seria valida.

xandevieira

rod.attack acho q vc não entedeu bem, no banco não vai ter repetição, mas na planilha sim. Por isso esta ocorrendo exceção.
Jose111 infelizmente não posso fazer conforme sua sugestão, pois uma celula da planilha é minha chave primaria.
Felagund não rolou, estourou a exceção e parou de inserir.

Uma coisa que fiz tb, foi verificar se ja existe a conta antes de inserir

boolean existe = contaContabilDB.contaJaExista(contaContabil.getCdContabil(), stmt);
					if(!existe){
						contaContabilDB.insert(contaContabil, stmt);						
					}

	public boolean contaJaExista(String cdContabil, PreparedStatement stmt){
		try {
			System.out.println("Verificando existencia da conta "+cdContabil);
			ResultSet rs = null;
			String sql = "select * from eincContaContabil c where c.cdempresa = 1 and c.cdContabil = '"+cdContabil+"'";
			rs = stmt.executeQuery(sql);
			return rs.next();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

mas de ja na primeira linha da o erro:

Verificando existencia da conta 111.01.0001 java.lang.RuntimeException: org.firebirdsql.jdbc.FBSQLException: Invalid column index. at br.com.softplan.sienge.inc.dao.db.ContaContabilDB.insert(ContaContabilDB.java:24) at br.com.softplan.sienge.util.LeitutaXLS.leituraINC(LeitutaXLS.java:62) at br.com.sienge.sienge.Main.main(Main.java:13) Caused by: org.firebirdsql.jdbc.FBSQLException: Invalid column index. at org.firebirdsql.jdbc.AbstractPreparedStatement.getField(AbstractPreparedStatement.java:267) at org.firebirdsql.jdbc.AbstractPreparedStatement.setString(AbstractPreparedStatement.java:228) at br.com.softplan.sienge.inc.dao.db.ContaContabilDB.insert(ContaContabilDB.java:16) ... 2 more

antes disso o erro ocorre la pela linha 5983, o arquivo totaliza 8967

rodrigo.bossini

Certo…na planilha tem valores repetidos…e no banco não…e esse coluna ( que tem valores repetidos na planilha) é sua chave primária no banco…
Então o que vc deseja fazer, qdo ocorrer a repetição na planilha? Se continuar inserindo, num tem jeito, vai dar exceção.

jcmird

Cara se eu fosse vc diminuiria o seu metodo try e colocaria o seu esse codigo nele

contaContabilDB.insert(contaContabil, stmt);

Pelo o jeito que tá o seu codigo quando dar exceção no banco vai para o for que iterar com a planilha.

abs

xandevieira

jcmird o colega Felagund sugeriu o mesmo, porem nao deu certo, retirei o try {} catch do insert e do leituraINC, porem não rolou.
Vou criar uma hashmap e iterar ele na inserção

xandevieira

Resolvi o problema com HashMap, vlw a intenção de todos.

um abraço

Criado 10 de julho de 2009
Ultima resposta 10 de jul. de 2009
Respostas 8
Participantes 5