问题描述
isBeforeFirst()
返回true
如果下一次调用next()
会把光标的第一行ResultSet
。换句话说,任何具有数据的成功查询一旦执行,将产生ResultSet
带有isBeforeFirst()
returning的true
。
只需从代码中删除该块,并让rs.next()
循环处理可能为空的ResultSet
s:
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");
result = new Object[6];
ResultSet rs = stmt.executeQuery(query);
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);
}
}
/* catch and finally snipped for clarity of the answer */
解决方法
我正在尝试为我的Web服务完成数据库访问方法。服务和数据库访问方法对于数据库中的所有其他表都可以正常工作,但是这一特定方法不能。当我查询数据库时,ResultSet
总是返回空(表示isBeforeFirst()
== true
)。
经过多次尝试,我将查询简化SELECT * FROM
VIDEOS
为简单的查询,看问题是否是我输入的数据和查询中使用的数据之间的某些区别,但是即使是用于选择表中所有项目的简单查询也没有返回任何结果。
这是我用来从数据库中获取信息的方法:
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;
}
任何帮助将不胜感激。
澄清说明:该方法是Web服务的一部分,该服务从DB中提取特定视频的路径,以发送给客户端。客户端上传视频,然后将其存储在文件系统中,并将其路径存储在DB本身中。
一旦看到数据库正常工作,我将替换为SELECT * FROM VIDEOS
,SELECT * FROM VIDEOS WHERE PHONENUM =
'%s' AND DATETIME = '%s'",phonenum,timeStamp
以便查询提取我需要的确切项目。