Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
NUC 15 Pro e NUC 15 Pro+ sono i due nuovi mini-PC di casa ASUS pensati per uffici e piccole medie imprese. Compatti, potenti e pieni di porte per la massima flessibilità, le due proposte rispondono in pieno alle esigenze attuali e future grazie a una CPU con grafica integrata, accompagnata da una NPU per la gestione di alcuni compiti AI in locale.
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-11-2008, 13:42   #1
UnknownSoldier
Member
 
Iscritto dal: Aug 2008
Messaggi: 210
[Java] SQLite e ResultSet non vanno d'accordo...

Salve, ho un problema. Sto creando un'applicazione standard per visualizzare i risultati di tabelle di database in una JTable. La mia applicazione dovrebbe poter connettersi a MySQL e SQLite. Con MySQL riesco a connettermi e ad eseguire query senza problemi. Con SQLite invece ho dei problemi.

Quando tento di eseguire una query con SQLite, viene lanciata una eccezione con il seguente messaggio: "ResultSet is TYPE_FORWARD ONLY". OK allora ho modificato lo statement in questo modo:

Codice PHP:
statement connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVEResultSet.CONCUR_READ_ONLY); 
Ma appena tento di connettermi ad SQLite un'eccezione viene lanciata con il seguente errore: "SQLite only supports TYPE_FORWARD_ONLY cursors".

Ma allora, come devo risolvere?

Se può esservi utile questa è la classe che gestisce la connessione al database che estende AbstractTableModel per i risultati visualizzabili nella JTable:

Codice PHP:
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

public class 
MyTableModel extends AbstractTableModel
{
    private 
Connection connection;
    private 
Statement statement;
    private 
ResultSet resultSet;
    private 
ResultSetMetaData metaData;
    private 
int numberOfRows 0;
    public 
boolean isConnected false;
    
    public 
void connect (String driverString databaseString usernameString passwordthrows Exception
    
{
        Class.
forName(driver);
        
        if (
driver.equals("com.mysql.jdbc.Driver"))
            
connection DriverManager.getConnection("jdbc:mysql://localhost/" databaseusernamepassword);
        else if (
driver.equals("org.sqlite.JDBC"))
            
connection DriverManager.getConnection("jdbc:sqlite:db.db");
        
        
statement connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVEResultSet.CONCUR_READ_ONLY);
        
        
isConnected true;
    }
    
    public 
void setQuery (String query)
    {
        try
        {
            if (
query.toLowerCase().contains("select"))
            {
                
resultSet statement.executeQuery (query);
                
                
metaData resultSet.getMetaData();
                
                
resultSet.last();
                
numberOfRows resultSet.getRow();
                
                
fireTableStructureChanged();
            }
            else
            {
                
statement.execute(query);
            }
        }
        catch (
Exception exception)
        {
            
JOptionPane.showMessageDialog(nullexception.getMessage(), "Errore"JOptionPane.ERROR_MESSAGE);
        }
    }
    
    public Class 
getColumnClass (int column)
    {
        if (
resultSet != null)
        {
            try
            {
                
String className metaData.getColumnClassName(column 1);
                return Class.
forName(className);
            }
            catch (
Exception exception)
            {
                
exception.printStackTrace();
            }
        }
        
        return 
Object.class;
    }
    
    public 
int getColumnCount()
    {
        if (
resultSet != null)
        {
            try
            {
                return 
metaData.getColumnCount();
            }
            catch (
Exception exception)
            {
                
exception.printStackTrace();
            }
        }
        
        return 
0;
    }
    
    public 
String getColumnName (int column)
    {
        if (
resultSet != null)
        {
            try
            {
                return 
metaData.getColumnName (column 1);
            }
            catch (
Exception exception)
            {
                
exception.printStackTrace();
            }
        }
        
        return 
"";
    }
    
    public 
int getRowCount()
    {
        return 
numberOfRows;
    }
    
    public 
Object getValueAt (int rowint column)
    {
        if (
resultSet != null)
        {
            try
            {
                
resultSet.absolute(row 1);
                return 
resultSet.getObject(column 1);
            }
            catch (
Exception exception)
            {
                
exception.printStackTrace();
            }
        }
        
        return 
"";
    }

    public 
void disconnect()
    {
        try
        {
            
resultSet null;
            
fireTableStructureChanged();
            
            if (
connection != null)
                
connection.close();
            if (
statement != null)
                
statement.close();
            
            
isConnected false;
        }
        catch (
Exception exception)
        {
            
exception.printStackTrace();
        }
    }

UnknownSoldier è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2008, 22:55   #2
dierre
Senior Member
 
L'Avatar di dierre
 
Iscritto dal: Sep 2004
Città: Interamnia Urbs
Messaggi: 2125
Ho trovato questo se ti può essere utile:

SQLite only supports forward cursors,
that is, when you make a SELECT statement and receive a set of rows,
you can only work through those rows one by one from the top using
next(). This is not a limitation, as this combined with the expressive
power of SQL lets you move around in a database in any desirable
fashion.
__________________
Un wormhole (buco di tarlo, in italiano), detto anche Ponte di Einstein-Rosen, è una ipotetica caratteristica topologica dello spaziotempo che è essenzialmente una "scorciatoia" da un punto dell'universo a un altro, che permetterebbe di viaggiare tra di essi più velocemente di quanto impiegherebbe la luce a percorrere la distanza attraverso lo spazio normale.
Go to a Wormhole
dierre è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 08:04   #3
UnknownSoldier
Member
 
Iscritto dal: Aug 2008
Messaggi: 210
Quote:
Originariamente inviato da dierre Guarda i messaggi
Ho trovato questo se ti può essere utile:

SQLite only supports forward cursors,
that is, when you make a SELECT statement and receive a set of rows,
you can only work through those rows one by one from the top using
next(). This is not a limitation, as this combined with the expressive
power of SQL lets you move around in a database in any desirable
fashion.
Sì grazie infatti ho capito che quindi non posso utilizzare i metodi last e absolute di ResultSet. Ho pensato quindi di salvare tutti i valori in un ArrayList < ArrayList < String > >

Ora però provo e spero che non ci siano problemi...
UnknownSoldier è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 09:47   #4
UnknownSoldier
Member
 
Iscritto dal: Aug 2008
Messaggi: 210
Allora, ho capito che la soluzione fosse quella di evitare di utilizzare i metodi last e absolute di ResultSet, allora con un ciclo while ho letto tutte le righe in modo sequenziale e ho salvato tutto in ArrayList < ArrayList < Object > >. Però ogni volta che eseguo una SELECT query viene lanciata una IllegalStateException:

Codice PHP:
java.lang.IllegalStateExceptionSQLite JDBCinconsistent internal state
    at org
.sqlite.RS.checkCol(RS.java:62)
    
at org.sqlite.RS.getColumnCount(RS.java:315)
    
at MyTableModel.getColumnCount(MyTableModel.java:81)
    
at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1205)
    
at javax.swing.JTable.tableChanged(JTable.java:4324)
    
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    
at javax.swing.table.AbstractTableModel.fireTableStructureChanged(AbstractTableModel.java:200)
    
at MyTableModel.setQuery(MyTableModel.java:61)
    
at DFDatabase$QueryHandler.actionPerformed(DFDatabase.java:67)
    
at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
    
at javax.swing.JTextField.postActionEvent(JTextField.java:705)
    
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
    
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
    
at javax.swing.JComponent.processKeyBinding(JComponent.java:2849)
    
at javax.swing.JComponent.processKeyBindings(JComponent.java:2884)
    
at javax.swing.JComponent.processKeyEvent(JComponent.java:2812)
    
at java.awt.Component.processEvent(Component.java:5818)
    
at java.awt.Container.processEvent(Container.java:2058)
    
at java.awt.Component.dispatchEventImpl(Component.java:4413)
    
at java.awt.Container.dispatchEventImpl(Container.java:2116)
    
at java.awt.Component.dispatchEvent(Component.java:4243)
    
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
    
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:697)
    
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:962)
    
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:834)
    
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:661)
    
at java.awt.Component.dispatchEventImpl(Component.java:4285)
    
at java.awt.Container.dispatchEventImpl(Container.java:2116)
    
at java.awt.Window.dispatchEventImpl(Window.java:2440)
    
at java.awt.Component.dispatchEvent(Component.java:4243)
    
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121
Questo è MyTableModel che ho modificato:
Codice PHP:
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;

public class 
MyTableModel extends AbstractTableModel
{
    private 
Connection connection;
    private 
Statement statement;
    private 
ResultSet resultSet;
    private 
ResultSetMetaData metaData;
    private 
int numberOfRows;
    private 
ArrayList ArrayList Object > > tableList = new ArrayList ArrayList Object > >();
    private 
ArrayList Object rows = new ArrayList Object >();
    public 
boolean isConnected false;
    
    public 
void connect (String driverString databaseString usernameString passwordthrows Exception
    
{
        Class.
forName(driver);
        
        if (
driver.equals("com.mysql.jdbc.Driver"))
            
connection DriverManager.getConnection("jdbc:mysql://localhost/" databaseusernamepassword);
        else if (
driver.equals("org.sqlite.JDBC"))
            
connection DriverManager.getConnection("jdbc:sqlite:db.db");
        
        
statement connection.createStatement();
        
        
numberOfRows 0;
        
isConnected true;
    }
    
    public 
void setQuery (String query)
    {
        try
        {
            if (
query.toLowerCase().contains("select"))
            {
                
resultSet statement.executeQuery (query);
                
metaData resultSet.getMetaData();
                
                
tableList.clear();
                
                for (
int i 1<= metaData.getColumnCount(); i++)
                    
rows.add (resultSet.getObject (i));
                
                while (
resultSet.next())
                {
                    for (
int i 1<= metaData.getColumnCount(); i++)
                        
rows.add (resultSet.getObject (i));
                    
                    
tableList.add (rows);
                    
rows.clear();
                }
                
                
numberOfRows tableList.size();
                
                
fireTableStructureChanged(); //riga 61
            
}
            else
            {
                
statement.execute(query);
                
JOptionPane.showMessageDialog(null"Query eseguita con successo""Query OK"JOptionPane.INFORMATION_MESSAGE);
            }
        }
        catch (
Exception exception)
        {
            
JOptionPane.showMessageDialog(nullexception.getMessage(), "Errore"JOptionPane.ERROR_MESSAGE);
        }
    }
    
    public 
int getColumnCount()
    {
        if (
resultSet != null)
        {
            try
            {
                return 
metaData.getColumnCount(); //riga 81
            
}
            catch (
Exception exception)
            {
                
exception.printStackTrace();
            }
        }
        
        return 
0;
    }
    
    public 
String getColumnName (int column)
    {
        if (
resultSet != null)
        {
            try
            {
                return 
metaData.getColumnName (column 1);
            }
            catch (
Exception exception)
            {
                
exception.printStackTrace();
            }
        }
        
        return 
"";
    }
    
    public 
int getRowCount()
    {
        return 
numberOfRows;
    }
    
    public 
Object getValueAt (int rowint column)
    {
        if (
resultSet != null)
        {
            
ArrayList Object rowList tableList.get(row);
            return 
rowList.get(column);
        }
        
        return 
"";
    }

    public 
void disconnect()
    {
        try
        {
            
resultSet null;
            
tableList.clear();
            
fireTableStructureChanged();
            
            if (
connection != null)
                
connection.close();
            if (
statement != null)
                
statement.close();
            
            
isConnected false;
        }
        catch (
Exception exception)
        {
            
exception.printStackTrace();
        }
    }

UnknownSoldier è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
Avalanche Studios, la software house che...
Tante novità in arrivo per OnePlu...
Novità per la smarthome da EZVIZ....
Intel SGX e AMD SEV-SNP aggirabili su pi...
Autovelox, parte il censimento ufficiale...
Adobe Premiere arriva su iPhone: l'app &...
Il Cybertruck di Tesla non può es...
Windows 11 25H2 è stato appena ri...
VMware, con la versione 9 di Cloud Found...
Area B e C Milano, stop alle auto benzin...
Huawei FreeBuds 7i arrivano in Italia: c...
Offerte Amazon Fire TV: smart TV per ogn...
iPhone 11 Pro Max e Apple Watch Series 3...
Toyota ha venduto solo 18 elettriche ad ...
Tutti i Ring in promo Amazon: videocitof...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:59.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v