Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

AMB

inserir resultado de um select num vector????

Mensagens Recomendadas

AMB

Boa Tarde

É o seguinte eu tenho um select que me dá vários valores.

public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {

	String caminho = "C:/Programas/PTW/DiaSoft/DataBase/user.mdb";
        Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();  
        Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + caminho);
        
        Statement stm = con.createStatement();
        
        ResultSet rs = stm.executeQuery ("SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = Id)))"); 
    
	if (rs.next()){
                    String ia = dapa.getString("ResumeNr");
                    System.out.println("Resume"+ia);
                    stm.executeQuery("SELECT MAX(D1) AS DAP1 FROM MeasData WHERE ParamNr = "+ia+"");
	    stm.executeUpdate("SELECT MAX(D1)AS DAP1 FROM MeasData WHERE (ParamNr = "+ia+")");
	    stm.executeQuery("SELECT MAX(D2) AS DAP2 FROM MeasData WHERE ParamNr = "+ia+"");
	    stm.executeUpdate("SELECT MAX(D2) AS DAP2 FROM MeasData WHERE ParamNr = "+ia+"");
	    stm.executeQuery("SELECT MAX(D3) AS DAP3 FROM MeasData WHERE ParamNr = "+ia+"");
	    stm.executeUpdate("SELECT MAX(D3) AS DAP3 FROM MeasData WHERE ParamNr = "+ia+"");

Não se é a melhor maneira, ou mesmo se é possível, mas queria guardar o resultado do select do Resultset num vector, para entrar no if calcular os máximos do primeiro valor do select (ia), quando calcula-se o D3(ultimo) passava para o segundo e fazia o mesmo, até ao ultimo valor do select do Resultset.

Já agora outra questão como posso ver o valor de cada SELECT MAX???

Obrigada

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AMB

Não sei se me fiz entender.....

O que pretendo era calcular os maximos de todos os parametros inseridos numa tabela, sendo o valor de todos esses parametros existentes retirados no primeiro select.

E queria ainda poder ver os resultados do calculo de todos os maximos.

Por exemplo, o primeiro select diz: 11, 12, 16, 23, 41

queria que calcula-se o maximo D1, D2 e D3 quando o Parametro é 11, e ver o resultado de D1, D2 e D3 calculado. Depois passava para o parametro 12 e fazia o mesmo, sempre assim...

Como posso fazer isso???

Obrigada

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Para guardar o resultado num array tens de instanciar o array e colocar lá os valores, para isso precisas saber o número de elementos que vêm no resultset. Para saberes o número de resultados dentro de um ResultSet, tens de ir para o último registo, usando o método last(), verificar o número da linha, através do getRow(), e voltar ao início com o beforeFirst(). Munido do número de registos podes instanciar o array e com o ciclo colocar os dados dentro do array.

Ou então, podes simplesmente usar um ArrayList ou uma LinkedList, que podem ser usados dentro de foreach, por exemplo:

ResultSet rs = stm.executeQuery (...
ArrayList array = new ArrayList();
while(rs.next()){
array.add(rs.getString(...
...

Quanto a obter valores de queries que devolvam escalares, funciona como todas as outras, a diferença é que em vez de usares um while para percorrer todos os elementos, podes aceder directamente ao primeiro, fazendo por exemplo um if(rs.next()) e depois usando o método adequado ao tipo de dados que pretendes.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Hum... parece que não percebi bem o que pretendias, acho que a minha resposta não está de acordo com o que colocaste depois....

Ora bem, fazes uma query para obter os valores máximos, pegas no ResultSet dessa query e percorres com um while. Para cada elemento executas uma nova query, para a qual recomendo que uses PreparedStatements. Voltas a obter um ResultSet e retiras o valor que te interessa.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AMB

package msi;

import java.sql.Array;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;


public class DAP {

public static void dos()throws SQLException{
String caminho = "C:/user.mdb";
    try {
	Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
} catch (InstantiationException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (IllegalAccessException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (ClassNotFoundException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}  
    Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + caminho);
    
    Statement stmt = con.createStatement();
    
   
    
    String strSql = "SELECT Id FROM PatientData";
    
    ResultSet rs = stmt.executeQuery(strSql);
    
    	
while (rs.next()){
	String resid = rs.getString("Id");
	System.out.println("Id "+resid);

	while(resid != null){
		String DAP1 = "SELECT MAX(D1) AS V1 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";

		ResultSet d1 = stmt.executeQuery(DAP1);
		String rd1 = d1.getString("V1");
		System.out.println("M1 "+rd1);


		String DAP2 = "SELECT MAX(D2) AS V2 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";

		ResultSet d2 = stmt.executeQuery(DAP2);
		String rd2 = d1.getString("V2");
		System.out.println("M2 "+rd2);
	}

}
}
public static void main(String[] args) {

	try {
		dos();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

}

Fiz uma pequena alteração ao código, mas estou com o mesmo problema e não estou conseguindo resolver....

Consigo visualizar todos os Ids presentes na tabela da bd, mas não estou conseguindo efectuar o cálculo do máximo...dá erro dizendo "estado de cursor inválido"

Alguém me dá uma ajudinha???

Obrigada, e desculpem minha ignorância....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Não consigo testar o código, não tenho a BD nem tenho Windows para correr uma ligação ODBC, mas parece-me que tens um ciclo infinito e que não estás a avançar o ponteiro para o primeiro registo antes de tentares aceder ao registo.

...
while(resid != null){
...

Nunca alteras o valor de resid dentro do while pelo que se for diferente de null no início, será sempre diferente de null e nunca vais sair do ciclo.

O problema de estado inválido do cursor parece-me ser devido a estas duas linhas

String rd1 = d1.getString("V1");
String rd2 = d1.getString("V2");

Um ResultSet contém um cursor interno que aponta para as várias linhas, mas quando é criado, está a apontar para um local antes da primeira linha, isto é, não está a apontar para uma linha válida. Para que ele passe a apontar para uma linha válida tens de invocar o método next().

Por isso é que é comum colocar sempre o next() dentro de um while ou dentro de um if antes de aceder ao registo, por um lado validamos se o ResultSet tem linhas por outro lado avançamos automaticamente o cursor para a primeira linha.

Altera o código para

ResultSet d1 = stmt.executeQuery(DAP1);
//Avançar o cursor para o primeiro registo, atenção que desta forma não se valida se existem registos.
d1.next(); //ou if(d1.next()) de modo a confirmar que existem resultados
String rd1 = d1.getString("V1");
System.out.println("M1 "+rd1);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AMB

Mto obrigada Knitter!!!!

Já estou conseguindo calcular os máximos com o código que você colocou. Só estou com um problema que você também referiu, por causa do while, como resolvo essa questão?? Se o retirar diz "ResultSet is closed". Mas tenho de ter um ciclo...para que no fim de calcular os máximos para o 1º Id, passe ao próximo, até que o Id seja null.

Obrigada

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Podes fazer de várias maneiras, a questão estará em colocar dentro do ciclo de dentro forma de alterar a string que o controla, a que me parece mais directa será alterar a condição para algo como:

while ((resid = rs.getString("Id")) != null)

Terás de declarar a variável resid antes deste ciclo, preferencialmente antes de qualquer ciclo junto à declaração do ResultSet.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AMB

Estou fazendo isso, mas dá erro dizendo que o ResultSet is closed!!

package msi;

import java.sql.Array;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;


public class DAP {

public static void dosemetria()throws SQLException{
String caminho = "C:/user.mdb";
    try {
	Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
} catch (InstantiationException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (IllegalAccessException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (ClassNotFoundException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}  
    Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + caminho);
    
    Statement stmt = con.createStatement();
    
   
    
    String strSql = "SELECT Id FROM PatientData";
    
    ResultSet rs = stmt.executeQuery(strSql);
    String resid;
String [] vector = new String [2];
    	
while (rs.next()){
	//String resid = rs.getString("Id");
	//System.out.println("Id "+resid);

	while ((resid = rs.getString("Id")) != null){

		String DAP1 = "SELECT MAX(D1) AS V1 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";
		ResultSet d1 = stmt.executeQuery(DAP1);
		d1.next();
		String rd1 = d1.getString("V1");
		System.out.println("M1 "+rd1);
		vector[0] = rd1;
		System.out.println("1 "+vector[0]);

		String DAP2 = "SELECT MAX(D2) AS V2 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";
		ResultSet d2 = stmt.executeQuery(DAP2);
		d2.next();
		String rd2 = d2.getString("V2");
		System.out.println("M2 "+rd2);
		vector[1] = rd2;
		System.out.println("2 "+vector[1]);



            Arrays.sort(vector);
            
            System.out.println("MAXIMO "+vector[1]);
            
        
            //ResultSet dosea = stmt.executeQuery("SELECT DAP FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"'");
            //String da = dosea.getString("DAP");
           // System.out.println("dose"+da);
		}
	}

}

public static void main(String[] args) {

	try {
		dosemetria();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

}

Dá o erro, mas mostra o resultado dos máximos, mas apenas calcula para o primeiro Id.

Mais uma vez muito obrigada por tudo Knitter

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

E eu dei-te uma resposta que, se tivesse pensado no que estava a escrever, tinha visto o quão parva era, enfim.... Se antes o ciclo era infinito, depois do que eu sugeri, não melhorou muito...

Ora bem, pegando no teu código e tentando alterar para algo que me faz mais sentido:

ResultSet d1 = null, d2 = null; 
String rd1 = null, rd2 = null;
while (rs.next()) {
    //Ler a string para este registo
    resid = rs.getString("Id");
    if(resid != null) {
        String DAP1 = "SELECT MAX(D1) AS V1 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";
        d1 = stmt.executeQuery(DAP1);
        d1.next();
        rd1 = d1.getString("V1");
        System.out.println("M1 "+rd1);
        vector[0] = rd1;
        System.out.println("1 "+vector[0]);
                       
        String DAP2 = "SELECT MAX(D2) AS V2 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";
        d2 = stmt.executeQuery(DAP2);
        d2.next();
        rd2 = d2.getString("V2");
        System.out.println("M2 "+rd2);
        vector[1] = rd2;
        System.out.println("2 "+vector[1]);
    }
}

Acho que isto faz o que pretendes, para cada um dos registos de rs, obtém o máximo D1 e D2.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Não deves poder anexar às respostas, creio que essa opção estará desactivada. Ou colocas num sistema de alojamento ou envias para o meu e-mal, que está indicado nos ícones debaixo do meu avatar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Como respondi por e-mail, o problema parece estar no driver que faz a ponte JDBC-ODBC para aceder ao MS Access e  no próprio MS Access. Tentando executar uma query enquanto se precorrem os resultados de outra query resulta sempre em excepções, ou porque o ResultSet inicial foi fechado, o que não deveria acontecer, ou, se instanciarmos novos Statements e ResultSets dentro do loop, porque não temos registos.

A excepção de "No current record" nem deveria sequer ser lançada e pela documentação do JDBC, a execução de uma query com executeQuer(String query) apenas pode produzir uma excepção, a de statement fechado, o que não é o caso.

É algo a testar com outros drivers e motores de bases de dados mas a alternativa para o problema parece-me ser a utilização de arrays ou listas onde colocar os valores temporariamente para fazer os loops separados.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AMB

Não estou a entender :-[

Eu já tenho um arraylist para os id's....

Deixo de utilizar o ResultSet???


   package msi;  
      
    import java.sql.Array;  
    import java.sql.Connection;  
    import java.sql.Driver;  
    import java.sql.DriverManager;  
    import java.sql.ResultSet;  
    import java.sql.SQLException;  
    import java.sql.Statement;  
   import java.util.ArrayList;  
   import java.util.Arrays;  
     
     
   public class DAP {  
          
       public static void dosemetria()throws SQLException{  
       String caminho = "C:/user.mdb";  
       try {  
           Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();  
       } catch (InstantiationException e) {  
           // TODO Auto-generated catch block  
           e.printStackTrace();  
       } catch (IllegalAccessException e) {  
           // TODO Auto-generated catch block  
           e.printStackTrace();  
       } catch (ClassNotFoundException e) {  
           // TODO Auto-generated catch block  
           e.printStackTrace();  
       }    
       Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + caminho);  
         
       Statement stmt = con.createStatement();  
         
       String strSql = "SELECT Id FROM PatientData";  
         
       ResultSet rs = null;  
       rs = stmt.executeQuery(strSql);  
         
       String [] vector = new String [16];  
         
       ArrayList<String> resultados = new ArrayList<String>();  
           while (rs.next()) {  
             String resid = rs.getString("Id");  
              if (resid != null){  
                 resultados.add(resid);  
                    
              }  
             
         
           
              for (String id : resultados) {  
             
               String DAP1 = "SELECT MAX(D1) AS V1 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";  
               ResultSet d1 = stmt.executeQuery(DAP1);  
            if (d1.next()){  
               String rd1 = d1.getString("V1");  
          System.out.println("M1 "+rd1);  
           vector[0] = rd1;  
           System.out.println("1 "+vector[0]);  
        }  
               String DAP2 = "SELECT MAX(D2) AS V2 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";  
            ResultSet d2 = stmt.executeQuery(DAP2);  
              if (d2.next()){  
              String rd2 = d2.getString("V2");  
              System.out.println("M2 "+rd2);  
               vector[1] = rd2;  
               System.out.println("2 "+vector[1]);  
             }  
             String DAP3 = "SELECT MAX(D3) AS V3 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";  
          ResultSet d3 = stmt.executeQuery(DAP3);  
             if (d3.next()){  
              String rd3 = d3.getString("V3");  
            System.out.println("M3 "+rd3);  
            vector[2] = rd3;  
          System.out.println("3 "+vector[2]);  
               }  
.
.
.              
              String DAP16 = "SELECT MAX(D16) AS V16 FROM MeasData WHERE (ParamNr = (SELECT ParamNr FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))))";  
            ResultSet d16 = stmt.executeQuery(DAP16);  
              if (d16.next()){  
              String rd16 = d16.getString("V16");  
              System.out.println("M16 "+rd16);  
            vector[15] = rd16;  
             System.out.println("16 "+vector[15]);  
            }  
            Arrays.sort(vector);  
             System.out.println("MAXIMO "+vector[15]);  
             stmt.executeUpdate("UPDATE Parameter SET DAP = ("+vector [15]+") WHERE (ParamNr = (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"'))))");  
            System.out.println("UPDATE Parameter SET DAP = ("+vector [15]+") WHERE (ParamNr = (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"'))))");  
               
            }  
         }  
         ResultSet df = stmt.executeQuery("SELECT DAP FROM Parameter WHERE ResumeNr IN (SELECT ResumeNr FROM ResumeData WHERE InfoNr IN (SELECT InfoNr FROM MeasInfo WHERE PatNr IN (SELECT PatNr FROM PatientData WHERE Id = '"+resid+"')))");  
         if (df.next()){  
         String dfim = df.getString("DAP");  
           System.out.println("DAP "+dfim);  
          
         stmt.executeUpdate("UPDATE PatientData SET [P Dose] = ("+dfim+") WHERE Id = '"+resid+"'");            System.out.println("UPDATE PatientData SET [P Dose] = ("+dfim+") WHERE Id = '"+resid+"'");  
         System.out.println("Actualização concluída");  
       }  
      }  
public static void main(String[] args) {  
         
       try {  
          dos();  
        } catch (SQLException e) {  
              // TODO Auto-generated catch block  
            e.printStackTrace();  
          }  
     }  
   
  }  

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AMB

Bom dia

Eu estive a ler em alguns sites e dizem que o resultset pode dar este erro, porque estão todos dirigidos ao mesmo statement  :hmm:

Mas não estou conseguindo utrapassar o problema, pois ou continua o mesmo erro, ou se os alterar a todos diz que o não existe nenhum registo actual...

Quando você falou nos ArrayList, mantem-se os resultset ??? É que não estou conseguindo resolver

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Vê o projecto exemplo que tenho em http://www.sergio-lopes.org/_storage/ExemploAccess.zip

Peguei no teu código e tentei implementar aquilo que me pareceu o objectivo. Todos essas repetições podiam ser colocadas num ciclo mas optei por continuar como tinhas, com um bloco para cada variável V1, V2, V3... até V16. Reutilizei as variáveis para limitar alguma confusão e usei PreparedStatements, que funcionam da mesma maneira que um Statement mas que permitem colocar parâmetros no SQL que são depois substituídos, é melhor que fazer concatenação de Strings.

No caso de estares a usar o Access, convém não partilhar Statements nem abrir novos Statements enquanto percorres os resultados que um Statement te deu, convém fazer as coisas por passos separados. Fui isso que fiz no código, com um ciclo coloco todos os IDs dentro de um ArrayList, fecho o Statement já que não o posso reutilizar, e com um ciclo separado percorro o ArrayList que tem as chaves e executo o SQL que é preciso.

Houve algum código que não percebi qual era o objectivo e que estava em locais que só iriam provocar problemas, ou porque as variáveis não teriam os valores correctos ou porque iria causar problemas com tentativas de reutilizar um Statement anterior, pelo que deixei esse código comentado.

O ficheiro zip contém um projecto para o NetBeans IDE 6.8, se usares outro IDE basta tirares a classe que está na pasta source. Está compilado pelo que existe um jar que podes testar. A localização para o ficheiro de Access ficou hardcoded.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AMB

Mais uma vez muito obrigada.

O código que está comentando é bastante importante... a primeira parte é que eu quero inserir o resultado do calculo do máximo e inserir na tabela Parameter no local correcto (correspondente o Id para o qual foi calculado), tal como inserir o mesmo dado na tabela PatientData.

O código está dando o seguinte erro, mesmo sem colocar as partes comentadas:

java.sql.SQLException: [Microsoft][Controlador Microsoft Access de ODBC] Não existe nenhum registo actual.

at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)

at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)

at sun.jdbc.odbc.JdbcOdbc.SQLExecute(Unknown Source)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(Unknown Source)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeQuery(Unknown Source)

at msi.TestDos.dosimetria(TestDos.java:65)

at msi.TestDos.main(TestDos.java:22)

sendo que a linha 65 : rs = prepStm1.executeQuery();

e a linha 22 : app.dosimetria("C:/user.mdb");

E está apenas mostrando o máximo para o primeiro id

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Não estou a ter erros com os pouco código que testei e com o ficheiro que tinhas disponibilizado. No entanto, esse parece-me um erro de reutilização de Statement/PreparedStatement. Não faço ideia de como corrigir isso e não tenho possibilidade de investigar mais sobre o que está a causar esse erro.

Se mais alguém tiver ideias que coloque aqui, pode ser uma cena parva que está a escapar mas não estou a ver o que se possa estar a passar no teu código.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AMB

Obrigada na mesma Knitter.

Mesmo alterando alguns statements do código antigo que tinha surge o mesmo erro: Não existe nenhum registo actual  :bored:

Nesse caso, a inserção do valor do primeiro id é colocado correctamente, na tabela Parameter e na tabela PatientData, mas não passa do primeiro valor por causa do erro.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AMB

Explica-me só uma coisa Knitter

em que local do código ele dá a indicação de passar para o segundo id??

é que acho que o problema está aí, porque o primeiro ele faz direitinho...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.