Dúvida - ResultSet com retorno vazio [Resolvido]

Olá pessoal.

Não estou conseguindo validar um retorno vazio:

while (rsV.next()) { if (!rsV.getString("NumSIMCard").equals("")) { System.out.println("Chamando o Próximo Registro"); } else { System.out.println("Chama Update"); } }

Faço um select, e quero validar esse retorno, o tipo é numeric. Mesmo eu deixando assim para verificar se é diferente de vazio ele entra, mas não entra no else.
o select é em vários campos…

primeiramente, vc deve fazer o seguinte…

if (!"".equals(rsV.getString("NumSIMCard"))) {

Vc deve comparar uma string vazia com a sua variável, pois se sua variável vier nula, pode dar NullPointerException antes de comparar…segundo, coloca tbm uma validação se a sua variável é diferente de null…

Assim…

if (!"".equals(rsV.getString("NumSIMCard")) && rsV.getString("NumSIMCard") != null) {

Agora, oq eu não entendi foi q vc disse q eh um tipo numeric…e pq vc tah pegando como string?

tenta isso q eu t falei e veja se funciona.

Oi Alexandre… obrigado pela atenção…

Mas ainda não funciona… ele chega no registro (que é o último, mas mesmo quanso coloco ele antes ele pula o if) e pula o if… nem entra nele

Olha o código mais completo:

[code]while (rsS.next()) {

				if (rsS.getString("NumSIMCard").equals("")) {
					
					InsereTELECOM insereNovo = new InsereTELECOM();
					insereNovo.insereTELECOM();
					
				} else {
					String verificaTudo = "select distinct SIMCard.Numero as NumSIMCard, Linha.numero as NumLinha, SIMCard.CodigoAPNProvisionada as CodAPN, Conta.Numero as NumConta, SIMCard.CodigoOperadora as CodOperadora, Plano.Nome as NomePlano, SIMCard.CodigoStatusSIMCard as CodStsSIMCard, Linha.DataAtivacao as DataAtv, SIMCard.CodigoFonteDados as CodFonteDados, Linha.CodigoStatusLinha as CodStsLinha, SIMCard.IMSI as IMSI, SIMCard.ConsumoDados as ConsDados from SIMCard, Linha, Conta, Plano where SIMCard.Numero = '"
							+ telecom.getSimcard()
							+ "' AND Linha.Numero = '"
							+ telecom.getLinha()
							+ "' AND SIMCard.CodigoAPNProvisionada = '"
							+ telecom.getApnUtilizada()
							+ "' AND Conta.Numero = '"
							+ telecom.getConta()
							+ "' AND SIMCard.CodigoOperadora = '"
							+ telecom.getOperadora()
							+ "' AND Plano.Nome = '"
							+ telecom.getPlano()
							+ "' AND SIMCard.CodigoStatusSIMCard = '"
							+ telecom.getStatusSIMCard()
							+ "' AND Linha.DataAtivacao = '"
							+ telecom.getDtAtivacao()
							+ "' AND SIMCard.CodigoFonteDados = '"
							+ telecom.getFonte()
							+ "' AND Linha.CodigoStatusLinha = '"
							+ telecom.getStatusLinha()
							+ "' AND SIMCard.IMSI = '"
							+ telecom.getImsi()
							+ "' AND SIMCard.ConsumoDados = '"
							+ telecom.getConsumoDados()
							+ "' AND SIMCard.NumeroConta = Conta.numero AND Linha.NumeroConta = Conta.numero AND Plano.NumeroConta = Conta.numero";

					System.out.println(verificaTudo);
					ResultSet rsV = stmt.executeQuery(verificaTudo);
					
                                                                                             // Não sei se essersV.next esteja afetando algo... 
					while (rsV.next()) {
						if (!"".equals(rsV.getString("NumSIMCard")) && rsV.getString("NumSIMCard") != null) {
						System.out.println("Chamando o Próximo Registro");
					} else { 
						System.out.println("Chama Update");
						//UpdateTELECOM localUpdateTELECOM = new UpdateTELECOM();				 
					}
					}
					
				}
			}[/code]

Então kra…seguinte…

esse teu select distinct aih…vc tem q usar todas as variáveis pra fazer esse select? num tem uma Primary Key? esse SIMCard.Numero eh tua PK?

pq vc tah comparando todos com todos, compare uma coisa soh pra deixar teu select mais limpo…

outra coisa, atribua o valor do teu SIMCard.Numero pra tua variável…assim vc pode comparar dpois…

daih vc verifica se eh null ou vazio… se for, eh insert, senão, update…

É que essa lógica que criei ficou mais fácil…

É assim, todos os outros campos, sem ser o simcard podem mudar, por isso faço um select geral, se retornar vazio, é que ele precisa atualizar (Update) o registro, pois teve alguma alteração.

Se retornar, quer dizer que aquele mesmo registro está gravado, então chama o próximo.

Para fazer insert, eu verifico primeio o simcard, se ele não existe, já faço o insert desse novo registro, senão, eu chamo esse select mais complexo.

Não to conseguindo jogar para uma variável…

na função .next(), quando chega o último registro ele pula e fecha o While, não faz as verificações nos ifs

mas eh pq o retorno do next() eh falso, por isso não vai cair no if mesmo…oq vc tem q fazer eh oq eu tinha falado…

faz um select pra buscar o código do SIM q vc quer…

caso seja nulo ou vazio insert, senão, update…

se for update, faça a query update nos campos passando tua variável q receberá o SIM…

ficará bem mais fácil

NumSIMCard é um valor numerico ? se for, voce pode usar o rs.getInt (deve ter Double tb e etc.)…

depois so comparar
if(rs.getInt(“NumSIMCard”) < 0) {
faz o que tu quer;
} else {
chama la o teu update da vida =D;
}

Ve se isso te ajuda mano :smiley:

Olá amigo rof20004

Não é o problema ai… o problema é que quando chega no While (rsS.next()) vem vazio, ele ja pula para o próximo registro e nem entra no if:

// Quando chega aqui e retorna zero...
ResultSet rsS = stmt.executeQuery(verificaSIMCard);
		//Ele le o while e já volta para o próximo registro... e não entra no if
				while (rsS.next()) {				
					if (rsS.getDouble("NumSIMCard") < 0){					
						InsereTELECOM insereNovo = new InsereTELECOM();
						insereNovo.insereTELECOM(telecom);
					} else {

Alexandre… eu não entendi direito o que vc passou… vou entender melhor…

Opa, Pacato, beleza?
Você já testou sua query em um SGBD com todos os parâmetros preenchidos?
Talvez você esteja somente passando um valor errado e o resultado venha nulo.
Confere isso, pra começar. Se não for, posta aqui que vamos achar essa solução ainda hoje. rs

Abraços,
fique com Deus!

Oi Nicolas tudo bom?

Funciona a query certinho… mas uma das minhas intenções é esse retorno nulo, onde vejo que o registro não está gravado no BD, assim chamo para fazer um update no registro…
Só que quando vem nulo não sei tratar no result set

hummm…nao seria melhor voce inserir na sua clausula o parametro " IS NOT NULL" ???

Exemplo:

“SELECT * FROM Tabela WHERE id = ? AND simCard IS NOT NULL”

assim ele traria todos os que nao fossem nulos, para o caso de atualizar voce poderia implementar outra coisa talvez.

[quote=Pacato]Oi Nicolas tudo bom?

Funciona a query certinho… mas uma das minhas intenções é esse retorno nulo, onde vejo que o registro não está gravado no BD, assim chamo para fazer um update no registro…
Só que quando vem nulo não sei tratar no result set[/quote]
Pera, pera…
Deixa eu ver se entendi direito:
Você faz uma consulta em cima de um registro. Se o campo X estiver vazio, você não faz nada, se não, atualiza, é isso?

Se for, eu acho que vale a pena você fazer a consulta dos seus dados e colocá-los em uma coleção.
Daí você itera na coleção e verifica isso, pra ficar mais “entendível”, sabe?

Por exemplo (chamei sua classe POJO de Telecom, porque não sei como você a nomeou):

  1. Você faz a sua consulta:

[code]public List recuperarDados() throws SQLException {
String sentenca = “MONTA SUA CONSULTA”;
PreparedStatement statement = connection.prepareStatement(sentenca);
ResultSet result = statement.executeQuery();

List<Telecom> telecoms = new ArrayList<Telecom>();
while (result.next()) {
    Telecom telecom = new Telecom(); 
    //
    // Se o campo numSIMCard for string, você pode fazer assim:
    if (result.getString("numSIMCard") != null && !result.getString("numSIMCard").equals(""))
        telecom.setNumSIMCard(result.getString("numSIMCard"));
    else
        telecom.setNumSIMCard("");
   
    //
    // Agora, se for inteiro, pode fazer assim:
    if (result.getInt("numSIMCard") != null && result.getInt("numSIMCard") != 0)
        telecom.setNumSIMCard(result.getInt("numSIMCard"));
    else
        telecom.setNumSIMCard(-1);

    telecoms.add(telecom);
}

result.close();    
return telecoms; 

}[/code]

  1. Você já deve ter o método UPDATE pronto. Logo, você itera na sua lista e verifica se o campo tá vazio ou não:

[code]TelecomDAO telecomDAO = new TelecomDAO();
List telecoms = telecomDAO.recuperarDados();
for (Telecom telecom : telecoms) {

// se for string...
if (!telecom.getNumSIMCard().equals("")) {
    telecomDAO.update(telecom);
}

// se for inteiro...
if (telecom.getNumSIMCard() != -1) {
    telecomDAO.update(telecom);
}

}
[/code]

Que tal?
Tenta essa panorâmica, e debuga o seu código, vendo os objetos que foram montados, analisando os valores retornados. Assim você pode ter um parecer pra gente!

Abraços!

Não rof… uma das intenções é trazer esse resultado vazio…

Nicolas…

Mesmo assim quando ele chega no bendito do ultimo registro ele sai e não entra no if… segue meu código inteiro:

[code]package br.com.simcard;

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import jxl.Cell;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class VerificarRegistro {
private static final int LINHA_INICIAL = 1;
private Workbook workbook;
private Sheet sheet;

public Date transformaData(String data) {
	Date retorno = null;
	SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
	try {
		retorno = formatador.parse(data);
	} catch (ParseException ex) {
		throw new RuntimeException(ex);
	}

	return retorno;
}

public VerificarRegistro(File vr) throws Exception, IOException,
		BiffException, ClassNotFoundException, SQLException {
	this.workbook = Workbook.getWorkbook(vr);
	this.sheet = workbook.getSheet(0);

	Verificador();
}

public void Verificador() {
	int nuLinhas = sheet.getRows();

	for (int nuLinhaAtual = LINHA_INICIAL; nuLinhaAtual < nuLinhas; nuLinhaAtual++) {
		Telecom telecom = carregarLinha(nuLinhaAtual);
		
		try {
			
			Conectar conn2 = new Conectar();
			Connection conn = conn2.getConnection();				
			Statement stmt = conn.createStatement();

			String verificaSIMCard = "select SIMCard.Numero as NumSIMCard from SIMCard Where SIMCard.numero = '"
					+ telecom.getSimcard() + "'";
		
			ResultSet rsS = stmt.executeQuery(verificaSIMCard);
			while (rsS.next()) {
				String SimCard = rsS.getString("NumSIMCard");
				
				if (!SimCard.equals(telecom.getSimcard()) || SimCard.equals(null) || SimCard.equals("")){					
					InsereTELECOM insereNovo = new InsereTELECOM();
					insereNovo.insereTELECOM(telecom);
				} else {			
				String verificaTudo = "select distinct SIMCard.Numero as NumSIMCard, Linha.numero as NumLinha, SIMCard.CodigoAPNProvisionada as CodAPN, Conta.Numero as NumConta, SIMCard.CodigoOperadora as CodOperadora, Plano.Nome as NomePlano, SIMCard.CodigoStatusSIMCard as CodStsSIMCard, Linha.DataAtivacao as DataAtv, SIMCard.CodigoFonteDados as CodFonteDados, Linha.CodigoStatusLinha as CodStsLinha, SIMCard.IMSI as IMSI, SIMCard.ConsumoDados as ConsDados from SIMCard, Linha, Conta, Plano where SIMCard.Numero = '"
						+ telecom.getSimcard()
						+ "' AND Linha.Numero = '"
						+ telecom.getLinha()
						+ "' AND SIMCard.CodigoAPNProvisionada = '"
						+ telecom.getApnUtilizada()
						+ "' AND Conta.Numero = '"
						+ telecom.getConta()
						+ "' AND SIMCard.CodigoOperadora = '"
						+ telecom.getOperadora()
						+ "' AND Plano.Nome = '"
						+ telecom.getPlano()
						+ "' AND SIMCard.CodigoStatusSIMCard = '"
						+ telecom.getStatusSIMCard()
						+ "' AND Linha.DataAtivacao = '"
						+ telecom.getDtAtivacao()
						+ "' AND SIMCard.CodigoFonteDados = '"
						+ telecom.getFonte()
						+ "' AND Linha.CodigoStatusLinha = '"
						+ telecom.getStatusLinha()
						+ "' AND SIMCard.IMSI = '"
						+ telecom.getImsi()
						+ "' AND SIMCard.ConsumoDados = '"
						+ telecom.getConsumoDados()
						+ "' AND SIMCard.NumeroConta = Conta.numero AND Linha.NumeroConta = Conta.numero AND Plano.NumeroConta = Conta.numero";

					ResultSet rsV = stmt.executeQuery(verificaTudo);
					
					while (rsV.next()) {
						String SimCard2 = rsV.getString("NumSIMCard");
						
					if (SimCard2.equals(telecom.getSimcard())){		
						System.out.println("Chamando o Próximo Registro");
					} else { 
						System.out.println("Chama Update");
						
						//UpdateTELECOM localUpdateTELECOM = new UpdateTELECOM();				 
					}
					}
				
				}
			}
			
		} catch (Exception e) {
			System.err.println("Erro na verificação dos Dados");
			System.err.println(e.getMessage());
		}
		
		
	} 
}

private Telecom carregarLinha(int nuLinhaAtual) {
	ValoresPlanilhaEnum planilhaEnum = null;
	Telecom linhaTelecom = new Telecom();
	Cell[] celulas = sheet.getRow(nuLinhaAtual);

	for (int nuCelulaAtual = 0; nuCelulaAtual < celulas.length; nuCelulaAtual++) {
		Cell celula = celulas[nuCelulaAtual];
		TelecomCelulasEnum celulaTelecom = TelecomCelulasEnum
				.obterCelulaTelecom(nuCelulaAtual);

		switch (celulaTelecom) {
		case SIMCARD:
			linhaTelecom.setSimcard(celula.getContents());
			break;
		case LINHA:
			linhaTelecom.setLinha(celula.getContents());
			break;
		case APN_UTILIZADA:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setApnUtilizada(planilhaEnum.getCodigo());
			break;
		case CONTA:
			linhaTelecom.setConta(celula.getContents());
			break;
		case OPERADORA:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setOperadora(planilhaEnum.getCodigo());
			break;
		case PLANO:
			linhaTelecom.setPlano(celula.getContents());
			break;
		case STATUS_SIM_CARD:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setStatusSIMCard(planilhaEnum.getCodigo());
			break;
		case DATA_ATIVACAO:
			TimeZone gmtZone = TimeZone.getTimeZone("GMT");
			SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
			format.setTimeZone(gmtZone);
			DateCell dataCell = (DateCell) celula;
			String dataFormatada = format.format(dataCell.getDate());
			linhaTelecom.setDtAtivacao(transformaData(dataFormatada));
			break;
		case FONTE:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setFonte(planilhaEnum.getCodigo());
			break;
		case STATUS_LINHA:
			planilhaEnum = ValoresPlanilhaEnum.obtervALORPorDesc(celula
					.getContents());
			linhaTelecom.setStatusLinha(planilhaEnum.getCodigo());
			break;
		case IMSI:
			linhaTelecom.setImsi(celula.getContents());
			break;
		case CONSUMO_DADOS:
			linhaTelecom.setConsumoDados(celula.getContents());
			break;
		}
	}

	return linhaTelecom;
}

public static void main(String[] args) throws BiffException, IOException,
		ClassNotFoundException, SQLException, Exception {
	
}

}[/code]

Oi,

Se você tivesse colocado um syserr já teria resolvido.

Tchauzin!

Como utilizaria Lina??

Oi,

[quote=Pacato]Como utilizaria Lina??
[/quote]

String verificaSIMCard = "select SIMCard.Numero as NumSIMCard from SIMCard Where SIMCard.numero = '" + telecom.getSimcard() + "'";

  • Primeiro execute o select count(*) na mão e verifique a quantidade de linhas que retorna.
  • Dentro do while coloque um syserr para contar quantas vezes ele entra (Verifique se bate com o retorno do count(*)).
  • Ainda dentro do while coloque um syserr mostrando o conteudo da coluna SimCard, verifique que diabos retornou do select.

Tchauzin!

ele retorna todas as linhas…MENOS, a que ele retorna vazio do BD, ai ele nem entra no while

Só que como a ultima, que forcei para ser um registro novo, ele não retorna do bd um valor, pois não esta cadastrado, esta é a intenção, só que antes de ele entrar novamente dentro do while para verificar o if, para chamar o insert, ele sai.

while (rsV.next()) {
if (!rsV.getString(“NumSIMCard”).equals("")) {
System.out.println(“Chamando o Próximo Registro”);
} else {
System.out.println(“Chama Update”);
}
}

Partindo da idéia de que vc quer que o else sejá resolvido tratando-se de um resultset vazio, dessa maneira que vc está fazendo, quando o resultset vier vazio, ele não entra dentro do laço, pq ele vai entrar ali quando vc tiver algum resultado.
Com o muito pouco conhecimento que tenho em java(2 dias de leitura didática), eu não sei validar um resultset vazio, mas pra uma solução bem simples e que talvez alguém com maior conhecimento já possa esclarecer isso com comandos mais próprios pra testar o resultset, eu recomendaria a criação de uma variável contadora que verificasse se ele encontrou o registro.

boolean rsDados = rsV.next;
if (!(rsDados)) {
System.out.println(“Chama update”);
}

Qualquer coisa posta ai se funcionou…

Boa sorte