2012-03-23 11 views
6

Sto eseguendo l'istruzione select con jdbc sybase driver (jconn3). Ho controllato la dichiarazione con esecuzione manuale su isql e tutte le righe sono state restituite correttamente. La dichiarazione che è in esecuzione su JDBC:Nessuna riga restituita da db - ma ci sono record da restituire

select * from mytable where date between ? and ? 

ho aggiunto il dateformat come yyyy-MM-dd HH:mm:ss e impostare il valore del tempo, come per la data 00:00:00 e 23:59:59 per la data di fine cominciare.

Non funziona. Il conteggio delle righe deve essere 1000 ma a volte è 770, a volte 990, a volte 564 ecc. Non esiste alcun conteggio di righe specifico che viene restituito ogni volta.

Successivamente ho aggiunto un'esecuzione extra che restituisce solo il conteggio delle righe. Per prima cosa eseguo l'istruzione select count(*) from ..., quindi eseguo select * from .... e ora "seleziona * da ... query restituisce il numero corretto di record ogni volta. Questo non può essere correlato con la memorizzazione nella cache. E la cosa strana è che sto usando gli stessi oggetti di preparazione e risultati per queste due esecuzioni.

Qualche idea su questo problema?

@Rulmeq, ecco il codice (Aggiunto il 2012-03-29)

ResultSet rs = null; 
PreparedStatement ps = null; 

ps = myConn.getConnection().prepareStatement("select count(*) from myTable where date between ? and ?"); 
ps.setDate(1, new java.sql.Date(beginDate.getTime())); // format : yyyy-MM-dd 
ps.setDate(2, new java.sql.Date(endDate.getTime())); // format : yyyy-MM-dd 
rs = ps.executeQuery(); 
rs.next(); 
// some logs here 

ps = myConn.getConnection().prepareStatement("select * from myTable where date between ? and ?"); 
ps.setTimestamp(1, new java.sql.Timestamp(beginDate.getTime())); // format : yyyy-MM-dd hh:mm:ss 
ps.setTimestamp(2, new java.sql.Timestamp(endDate.getTime())); // format : yyyy-MM-dd hh:mm:ss 
rs = ps.executeQuery(); 
while(rs.next()){ 
    ........ 
} 
+1

Mostraci il tuo codice. – Goibniu

+0

@Rulmeq, ho aggiunto il codice in questione. – Aykut

+1

Puoi includere la tua istanziazione (definizione) di beginDate e endDate nel tuo codice. Sembrano essere la chiave qui. –

risposta

0

Grazie per tutto, ma il problema è stato risolto e non è stato collegato a jdbc. Era collegato all'uso di System.currentTimeMillis() e il sistema host è troppo veloce. Ecco perché il sistema a volte usa lo stesso ms. Ho cambiato i riferimenti.

2

Quello che penso il problema è il codice che si utilizza per assegnare i valori datetime agli argomenti di query. E ora come si è specificato che il codice con "select * from ..." sta lavorando bene, quindi penso che l'unica differenza tra loro è che è possibile utilizzare

ps = myConn.getConnection().prepareStatement("select Count(*) from myTable where date between ? and ?"); 
ps.setTimestamp(1, new java.sql.Timestamp(beginDate.getTime())); 
ps.setTimestamp(2, new java.sql.Timestamp(endDate.getTime())); 
rs = ps.executeQuery(); 

per "select count (*) da. . "

+0

@Shanbaz, questa non è una soluzione ma hai analizzato bene. Grazie. – Aykut

0

Nella funzione Oracle TO_DATE sarebbe utile come sotto.

"select count(*) from myTable where date between TO_DATE(?, 'yyyy-mm-dd') and TO_DATE(?, 'yyyy-mm-dd')" 
+0

Thx ma stiamo usando sybase ase – Aykut

1

La data è definita come data, datetime, smalldatetime o timestamp in myTable? Stai usando setDate e setTimestamp. Uno di questi non corrisponde al tipo di data definito in myTable.

Problemi correlati