|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
[Java] ResultSet errore nell'effettuare query
Salve a tutti ho un problema nell'utilizzare la classe ResultSet
Posto il codice estrapolato dal mio programma nella sua parte essenziale Codice:
final String USERNAME = "";
final String PASSWORD = "";
final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
final String URLMondrian = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\MondrianFoodMart.mdb;}";
Connection c2 = null; //MondrianFoodMart
Statement statement = null;
String query15 = "SELECT time_by_day.week_of_year, sales_fact_1997.product_id, " +
"sales_fact_1997.store_id, sales_fact_1997.promotion_id, sales_fact_1997.customer_id, " +
"Sum(sales_fact_1997.store_sales) AS SommaDistore_sales, Sum(sales_fact_1997.store_cost) " +
"AS SommaDistore_cost, Sum(sales_fact_1997.unit_sales) AS SommaDiunit_sales " +
"FROM sales_fact_1997 INNER JOIN time_by_day ON sales_fact_1997.time_id = time_by_day.time_id " +
"GROUP BY time_by_day.week_of_year, sales_fact_1997.product_id, sales_fact_1997.store_id, " +
"sales_fact_1997.promotion_id, sales_fact_1997.customer_id";
try {
Class.forName(DRIVER);
try {
c2 = DriverManager.getConnection(URLMondrian, USERNAME, PASSWORD);
statement = c2.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet resultSet = statement.executeQuery(query15);
resultSet.last();
int rowCountMondrian1997 = resultSet.getRow();
System.out.println(rowCountMondrian1997);
//System.out.println(rowCountMondrian1997);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
La tabella sales_fact_1997 ha 86836 record, il risultato della query (testato in access) ne ha 86823. Quando nel mio programma estrapolo 1 record per volta, il puntatore arrivato sul numero 86824 va in errore Codice:
java.sql.SQLException: [Microsoft][Driver Manager ODBC] Stato del cursore non valido. at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source) at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(Unknown Source) at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(Unknown Source) at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source) at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(Unknown Source) Nel codice che ho postato mi muovo sull'ultimo elemento e lo stampo, ed è 86836, invece vorrei fosse 86823. Grazie in anticipo per l'aiuto. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Posta il loop sul resultset. Intanto prova a fare
Codice:
DatabaseMetaData foobar = connection.getMetaData(); System.out.println(foobar.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY)); |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
Quote:
Comunque il mio ciclo è così Codice:
//Vendite Mondrian a grana settimana, anno 1997
String query15 = "SELECT time_by_day.week_of_year, sales_fact_1997.product_id, " +
"sales_fact_1997.store_id, sales_fact_1997.promotion_id, sales_fact_1997.customer_id, " +
"Sum(sales_fact_1997.store_sales) AS SommaDistore_sales, Sum(sales_fact_1997.store_cost) " +
"AS SommaDistore_cost, Sum(sales_fact_1997.unit_sales) AS SommaDiunit_sales " +
"FROM sales_fact_1997 INNER JOIN time_by_day ON sales_fact_1997.time_id = time_by_day.time_id " +
"GROUP BY time_by_day.week_of_year, sales_fact_1997.product_id, sales_fact_1997.store_id, " +
"sales_fact_1997.promotion_id, sales_fact_1997.customer_id";
String query16 = "SELECT Calendar_year_lookup.Yr, Shop_facts.Article_id, " +
"Shop_facts.Color_code, Shop_facts.Week_id, Shop_facts.Shop_id, Shop_facts.Margin, " +
"Shop_facts.Amount_sold, Shop_facts.Quantity_sold " +
"FROM Calendar_year_lookup INNER JOIN Shop_facts ON Calendar_year_lookup.Week_id = " +
"Shop_facts.Week_id";
ResultSet resultSetSalesFact1997Mondrian = getResultSet(c2, query15);
ResultSet resultSetSalesFactFashion = getResultSet(c1, query16);
//Conta il numero delle righe nei resultSet
resultSetSalesFact1997Mondrian.last();
int rowCountMondrian1997 = resultSetSalesFact1997Mondrian.getRow();
resultSetSalesFact1997Mondrian.beforeFirst();
resultSetSalesFactFashion.last();
int rowCountFashion = resultSetSalesFactFashion.getRow();
resultSetSalesFactFashion.beforeFirst();
int progress = (rowCountMondrian1997 + rowCountFashion) / 82; // 82% della barra di caricamento
Vector<OWLIndividual> individualVectorSaleGrainWeek1997 = new Vector<OWLIndividual>();
int saleGrainWeek1997_counter = 0;
for (int sale1997=0; sale1997<rowCountMondrian1997; sale1997++)
{
resultSetSalesFact1997Mondrian.next(); //Avanza in avanti di 1 il cursore
float revenue = resultSetSalesFact1997Mondrian.getFloat("SommaDistore_sales");
float cost = resultSetSalesFact1997Mondrian.getFloat("SommaDistore_cost");
int currentCustomer= resultSetSalesFact1997Mondrian.getInt("customer_id");
int currentPromotion = resultSetSalesFact1997Mondrian.getInt("promotion_id");
int currentShoppingCenter = resultSetSalesFact1997Mondrian.getInt("store_id");
int currentProduct = resultSetSalesFact1997Mondrian.getInt("product_id");
String individualSale1997 = "SaleGrainWeek1997_" + saleGrainWeek1997_counter;
individualVectorSaleGrainWeek1997.add(saleGrainWeek1997Class.createOWLIndividual(individualSale1997));
.... un bel po di codice che non ha nulla a che fare con il problema ....
//Avanzamento barra percentuale
if ((sale1997 % progress) == 0)
changedState(conta++);
}
public static ResultSet getResultSet (Connection connection, String query) throws SQLException{
Statement statement = null;
try {
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch (SQLException e) {
e.printStackTrace();
}
ResultSet resultSet = statement.executeQuery(query);
return resultSet;
}
Il codice omesso poi riempie le proprietà dell'ontologia con i dati recuperati dai database, ma non è inerente con il problema. Dopo questo ciclo ve n'è un altro che opera sul secondo database, funzionante. Il problema è nella variabile rowCountMondrian1997 che dovrebbe valere 86823 e non 86836. Arrivato al passo 86824 arriva fuori l'errore che ho postato nel mio primo messaggio. Ultima modifica di k_mishima : 17-05-2011 alle 19:26. Motivo: Errori di battitura |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Se cambi ResultSet.TYPE_SCROLL_INSENSITIVE con ResultSet.TYPE_SCROLL_SENSITIVE succede uguale?
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Prova sostituendo il loop
Codice:
for (int sale1997=0; sale1997<rowCountMondrian1997; sale1997++)
{
resultSetSalesFact1997Mondrian.next(); //Avanza in avanti di 1 il cursore
Codice:
while(resultSet.next()) |
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
Quote:
L'errore è proprio nel resultSet che ha size 86836 invece di 86823. Non ho idea di cosa ci sia nelle ultime 13 righe, infatti non vi si riesce ad accedere |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Se non crei il secondo ResultSet, il primo ha lunghezza comunque errata?
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
Ummm nada il problema sta in odbc. Mi dispiace ma devi cambiare dbms. Non puoi migrare i dati da access a mysql?
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
no, il db deve rimanere access
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
risolto!
Era errato lo statment, essendo un'aggregazione, non può essere impostato come updatable, quindi Codice:
statement = connection.createStatement(); |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 691
|
ottimo! anche se a velocità vedi come cambia se cambi pure dbms
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:37.




















