Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Il primo Micro RGB di Samsung per il salotto θ il 65 pollici da 2.749 euro. Sul banco di misura abbiamo rilevato 2.000 nit di picco, nero assoluto con il local dimming e il 91,4% del BT.2020, il colore piω ampio che abbiamo misurato su un LCD
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
Apple ha rinnovato iPhone 18 Pro soprattutto dentro: chip A20 Pro a 2 nm con memoria affiancata al SoC, camera di vapore tre volte piω ampia, Dynamic Island piω piccola del 25% grazie a Face ID sotto il display e fotocamera principale con diaframma variabile da f/1.48 a f/4. Lo abbiamo misurato al colorimetro e nei benchmark, usato con iOS 27 e messo alla prova in fotografia tra laghi, borghi e interni poco illuminati
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
A Londra, per il trentennale dei Toughbook, Panasonic ha presentato il tablet G3 e il 2-in-1 34. Con Jon Tucker, a capo dell'ingegneria europea, abbiamo parlato di ciς che non si vede: batterie, antenne, porte seriali e accorgimenti nati sul campo
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_INSENSITIVE, ResultSet.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 driver, String database, String username, String password) throws Exception
    
{
        Class.
forName(driver);
        
        if (
driver.equals("com.mysql.jdbc.Driver"))
            
connection = DriverManager.getConnection("jdbc:mysql://localhost/" + database, username, password);
        else if (
driver.equals("org.sqlite.JDBC"))
            
connection = DriverManager.getConnection("jdbc:sqlite:db.db");
        
        
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.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(null, exception.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 row, int 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: 2126
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.IllegalStateException: SQLite JDBC: inconsistent 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 driver, String database, String username, String password) throws Exception
    
{
        Class.
forName(driver);
        
        if (
driver.equals("com.mysql.jdbc.Driver"))
            
connection = DriverManager.getConnection("jdbc:mysql://localhost/" + database, username, password);
        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; i <= metaData.getColumnCount(); i++)
                    
rows.add (resultSet.getObject (i));
                
                while (
resultSet.next())
                {
                    for (
int i = 1; i <= 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(null, exception.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 row, int 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


Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34 Panasonic, 30 anni di Toughbook: la "Bibbia...
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Al via le offerte Amazon Prime e tutte l...
Prime Day e Amazon Seconda Mano: sconto ...
Cuffie e auricolari in offerta Prime Day...
Prime day: 7 mini PC in super sconto da ...
Scope elettriche e lavapavimenti Prime D...
Smartphone Prime Day: le migliori occasi...
Microsoft 365 Family in offerta Prime Da...
E-bike in offerta Prime Day: HillMiles e...
Prime Day TV: OLED LG B6E 65'' a 1.299€,...
Portatili in offerta Prime Day: i 5 migl...
300 milioni di dollari di server NVIDIA ...
'Io sono Giorgia': la Premier Meloni reg...
Galaxy S27 Ultra con Exynos 2700, Samsun...
Altman: tra OpenAI e Anthropic sulla sic...
Tesla Robotaxi, la notte è ancora...
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: 06:11.


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