UnknownSoldier
08-11-2008, 13:42
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:
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:
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();
}
}
}
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:
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:
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();
}
}
}