Jump to content
Leodellari

Manipulação de dados

Recommended Posts

Leodellari

Olá,

Estou começando no java. Estou com uma dúvida que talvez seja besta, mas olhei alguns tutoriais da internet e não consegui resposta para o que quero fazer.

Quando se resgata os valores de uma tabela de uma base de dados, os tutoriais que vi demonstram como armazenar os valores em uma variável e a exibir os valores em uma lista (usando um controle da interface ou usando o comando println). Mas eu queria trabalhar de outra maneira (não quero exibir valores em listas, quero realizar operações com os dados resgatados ).

No vb eu costumo resgatar os valores de uma tabela, armazenar em um DataTable, e quando quero um valor desse DataTable, eu consigo resgatar apenas um valor usando "DataTable.Rows(i)(j).ToString()", mas não estou conseguindo encontrar uma maneira de fazer isso no java. Encontrei o método "ResultSet.absolut(int)", que posiciona o cursor em apenas uma linha, mas não estou conseguindo mesclar esse método getString(String) (ou getDouble(), getInt(), ...) (que posiciona o cursor em uma coluna) para conseguir resgatar um único valor da tabela. Alguém pode me apresentar uma maneira de fazer isso?

 

 

Share this post


Link to post
Share on other sites
Leodellari

Obrigado por responder Iron. Eu já tinha visto esse arquivo antes. Inclusive, foi nele que encontrei a função ResulSet.absolute(Int arg). Hoje fui dar uma olhada em como utilizar a função absolute(). Pelo exemplo que eu encontrei, eu estou utilizando a função de forma correta (seleciono a linha, e então especifico em qual coluna encontra-se o valor que desejo). Segue o link: < http://www.java2s.com/Tutorials/Java/java.sql/ResultSet/Java_ResultSet_absolute_int_row_.htm >.

Mas comigo não está funcionando. Estou recebendo o seguinte erro: net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.4 feature not supported. Já baixei mais dois UcanAcces aqui para ver se resolvia o problema, e nada. A função ResultSet.next(), até onde vi, está funcionando bem (eu consigo fazer um loop "while (rs.next()) {" para obter todos os valores do resutset, mas não consigo utilizar a função absollute() do Result Set. Vou mandar todo o erro para o caso de alguém querer dar uma olhada.

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.4 feature not supported
	at net.ucanaccess.jdbc.UcanaccessResultSet.absolute(UcanaccessResultSet.java:96)
	at Interface.Interface1$2.actionPerformed(Interface1.java:94)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.sql.SQLFeatureNotSupportedException: feature not supported
	at org.hsqldb.jdbc.JDBCUtil.notSupported(Unknown Source)
	at org.hsqldb.jdbc.JDBCResultSet.checkNotForwardOnly(Unknown Source)
	at org.hsqldb.jdbc.JDBCResultSet.absolute(Unknown Source)
	at net.ucanaccess.jdbc.UcanaccessResultSet.absolute(UcanaccessResultSet.java:94)
	... 37 more

 

 

Share this post


Link to post
Share on other sites
iron

Pelo que percebi o absolute, coloca-te numa determinada linha do resultSet.

Quando fazes o rs.next() faz algo parecido. Este ciclo faz com que percorra todas as linhas que obteve.

Em vez de usares o absolute, utiliza o rs e vai buscar os valores utilizando o getInt(), getString(), ... em que passas por parâmetro o nome da coluna da tabela na base de dados ou então o indice onde está.

 

Exemplo do link que dei:

ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
	String coffeeName = rs.getString(1);
    int supplierID = rs.getInt(2);
    float price = rs.getFloat(3);
    int sales = rs.getInt(4);
    int total = rs.getInt(5);
    System.out.println(coffeeName + "\t" + supplierID +
    	"\t" + price + "\t" + sales +
        "\t" + total);
}

 

 

Caso não resolva, podes colocar aqui o troço do código de onde fazes o pedido à base de dados e utilizas o absolute?

Edited by iron
  • Vote 1

Cumprimentos,
iron

Share this post


Link to post
Share on other sites
Leodellari

Posso sim, colocarei o código aqui.

Já encontrei esse seu exemplo na internet. O next faz com que o cursor passe uma linha adiante no rs. O que o looping (while (rs.next()) faz é percorrer uma linha por vez do rs. A cada loop o cursor muda a linha em que ele está (passando para a linha seguinte), armazena os valores de cada coluna em uma variável, e então já salva o seguinte valor em uma lista. Eu entendi bem o funcionamento. Posso tirar o while e colocar o next (fiz isso aqui), e então o cursor será posicionado na primeira linha (visto que o cursor não está posicionado em nenhuma linha). Testei o rs.first() aqui para ver se conseguia usar a função, e não funcionou, como o absolute(). Estou pensando que talvez algum dos jars que eu adicionei ao projeto esteja desatualizado, pois o next() funciona (eu consigo me conectar a base de dados, consigo armazenar os valores no Result Set, e consigo exibir os valores no form que criei). Verei se o meu java está atualizado.

Segue todo o código.

JButton btnNewButton = new JButton("New button");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			 
				String variable = "";
				Integer var = 1;
				Connection con = null;
				Statement sta = null;
				ResultSet res = null;
				
				String strConnection = "D:\\Documents\\Leonardo\\Trabalho MEF\\Teste Eclipse\\Teste1.accdb";
				String dbURL = "jdbc:ucanaccess://" + strConnection;
				
				try {
					
					Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
					con = DriverManager.getConnection(dbURL);
					sta = con.createStatement();
					res = sta.executeQuery("SELECT * FROM Teste1");
					res.first();
					//while (res.next()) {
					variable = res.getString(1);
					//}
				} catch (SQLException | ClassNotFoundException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
				finally {
					try {
						if (con != null) {
							 res.close();
							 sta.close();
							 con.close(); 
						}
					}
					catch (SQLException ex) {
						ex.printStackTrace();
					}
				}
			}

 

Share this post


Link to post
Share on other sites
Leodellari

Nesse código eu sei que, dentro do loop while apenas a última variável será armazenada na variável. Mas é apenas um teste que estou fazendo... Só para ver como funciona o java.

Share this post


Link to post
Share on other sites
Leodellari

Consegui aqui.

Passando o mouse em cima do "imports java.sql.ResultSet" aparece uma caixa de texto que diz que o ResultSet permite apenas que o cursor seja movido da primeira para a última linha. Lá diz também que é possível tornar o ResultSet srollable na hora em que se declara o Statement. Testei aqui e funcionou. Segue o código de como deve ficar o Statement, para tornar o Result Set scrollable e atualizável.

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

 

Edited by Leodellari

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.