JDBC gibt eine leere Ergebnismenge (rs.isBeforeFirst() == true), obwohl die Tabelle nicht leer ist
Ich bin versucht, um einen Zugriff auf die DB-Methode für meine Web-Service. Der service und die DB-Zugriffs-Methoden funktionieren für alle anderen Tabellen in der DB, aber diese spezielle Methode nicht. Wenn ich die Abfrage der DB, die ResultSet
immer wieder leer (also isBeforeFirst() == true
).
Nach vielen versuchen habe ich Schneide meine Abfrage auf eine einfache SELECT * FROM VIDEOS
um zu sehen, ob das problem ein Unterschied zwischen den Daten, die ich eingegeben und die Daten, die ich in meiner Abfrage, aber selbst diese einfache Abfrage auswählen, um alle Elemente in der Tabelle nicht zurückkehren, ohne Ergebnis.
Dies ist die Methode, die ich verwenden, um ziehen Sie die Informationen aus der DB:
public static Object[] getVideo(String phonenum, String timeStamp)
{
Connection c = null;
Statement stmt = null;
Object[] result = null;
try
{
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:lineappDB.db");
c.setAutoCommit(false);
System.out.println("Opened database successfully");
stmt = c.createStatement();
String query = String.format("SELECT * FROM VIDEOS");
ResultSet rs = stmt.executeQuery(query);
//If no data was found
if (rs.isBeforeFirst())
{
rs.close();
stmt.close();
c.close();
return null;
} else
{
result = new Object[6];
while (rs.next())
{
result[0] = rs.getInt(1);
result[1] = rs.getString(2);
result[2] = rs.getString(3);
result[3] = rs.getString(4);
result[4] = rs.getString(5);
result[5] = rs.getInt(6);
}
}
rs.close();
stmt.close();
c.close();
} catch (Exception e)
{
try
{
if (!c.isClosed())
{
c.commit();
c.close();
}
} catch (Exception ex)
{
System.err.println(ex.getClass().getName() + ": " + ex.getMessage());
return null;
}
System.err.println(e.getClass().getName() + ": " + e.getMessage());
return null;
}
System.out.println(String.format("Succesfully pulled from DB - %s %s", result[1], result[2]));
return result;
}
Jede Hilfe wird sehr geschätzt.
KLÄRUNG EDIT:
Die Methode ist Teil eines web-service, der zieht einen Weg von einem bestimmten video aus der DB, werden zu einem client gesendet. Die videos hochgeladen von Kunden und sind dann im Dateisystem abgelegt, und Ihre Pfade sind gespeichert in der DB selbst.
Sehe ich einmal die DB funktioniert, werde ich ersetzen SELECT * FROM VIDEOS
mit SELECT * FROM VIDEOS WHERE PHONENUM = '%s' AND DATETIME = '%s'", phonenum, timeStamp
so, dass die Abfrage zieht die genaue Position, die ich brauche.
.close()
Befehle in eine finally
blockDanke für die Ratschläge, das werde ich tun.
wenn ich meine
.close()
Befehle in einem finally
block, eclipse schreit, dass ich nicht die Ausnahmen behandeln. Und so werde ich brauchen, um eine Doppel - try catch
block wieder. Konnte Sie zeigen eine korrekte Beispiel?tatsächlich, in diesem Tag und Alter, warum nicht die try-mit-Ressourcen-idiom?
InformationsquelleAutor Yuval | 2014-10-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
isBeforeFirst()
zurücktrue
wenn der nächste Aufruf vonnext()
setzen Sie den cursor auf die erste Zeile derResultSet
. In anderen Worten, jede erfolgreiche Abfrage mit Daten, die, einmal ausgeführt, wird eineResultSet
mitisBeforeFirst()
Rückkehrtrue
.Einfach entfernen, der block von code, und die
rs.next()
loop Umgang mit potenziell leerResultSet
s:(cc: @1CodeRed ) +1 für die Erklärung, was
.isBeforeFirst()
wirklich bedeutet. In der Tat, der test für eine leere Ergebnismenge wird, wenn.isBeforeFirst()
zurückfalse
, nichttrue
(als OP vermutet).Hey Mureinik, Yuval nehme an, verwenden Sie if (!rs.isBeforeFirst ()), um zu überprüfen, ob der ResultSet leer ist oder nicht. Wenn es nicht leer ist, dann kann er weiter gehen und verbrauchen die Ergebnismenge.
InformationsquelleAutor Mureinik
Verwenden Sie if (!rs.isBeforeFirst()) anstatt if (rs.isBeforeFirst()). das problem wäre gelöst.
InformationsquelleAutor manohar e