我在用于SQLite的JDBC驱动程序中有问题。
我正在用SELECT语句执行查询。
如果我得到一个空ResultSet
(0行),则在调用时会抛出“ Closed ResultSet”异常getString(1)
。
没有大量的JDBC经验,我的理论(我无法通过JavaDocs确认ResultSet
)是
getString(1)
对空(零行)结果集不起作用(通过设计或由于错误)ResultSet
的“打开”标志设置false
为零行(同样是设计或错误)我看到了此错误报告,但不确定是否相关。
我的要求是:
ResultSet
所有JDBC驱动程序中的泛型?对于#4,我的解决方案是立即使用isFirst()
call executeQuery()
来检查结果集中是否有任何行。这是最佳做法吗?
(我也可以只选择一个insetad计数,因为我真的不需要结果集,只需要零-非零标志,但是如果我确实关心select的结果,我想知道正确的做法)
谢谢!
是否为空,但执行以下操作始终会 出错 :
resultSet = statement.executeQuery(sql);
string = resultSet.getString(1); // Epic fail. The cursor isn't set yet.
这不是错误。这是记录的行为。每个不错的JDBC教程都提到了它。您需要先使用设置ResultSet的游标,next()
然后才能访问任何数据。
如果您实际上对所谓的唯一行是否 存在 感兴趣,则只需检查的结果next()
。例如在一个虚构UserDAO
类中:
public boolean exist(String username, String password) throws SQLException {
boolean exist = false;
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id FROM user WHERE username = ? AND password = MD5(?)");
) {
statement.setString(1, username);
statement.setString(2, password);
try (ResultSet resultSet = statement.executeQuery()) {
exist = resultSet.next();
}
}
return exist;
}
如果你真的希望只有 零 或 一个 行,那么就这样做:
public User find(String username, String password) throws SQLException {
User user = null;
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, username, email, birthdate FROM user WHERE username = ? AND password = MD5(?)");
) {
statement.setString(1, username);
statement.setString(2, password);
try (resultSet = statement.executeQuery()) {
if (resultSet.next()) {
user = new User(
resultSet.getLong("id"),
resultSet.getString("username"),
resultSet.getString("email"),
resultSet.getDate("birthdate"));
}
}
}
return user;
}
然后只需在业务/域对象中相应地处理它,例如
User user = userDAO.find(username, password);
if (user != null) {
// Login?
}
else {
// Show error?
}
如果你真的希望只有 零 或 许多 行,那么就这样做:
public List<User> list() throws SQLException {
List<User> users = new ArrayList<User>();
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, username, email, birthdate FROM user");
ResultSet resultSet = statement.executeQuery();
) {
while (resultSet.next()) {
users.add(new User(
resultSet.getLong("id"),
resultSet.getString("username"),
resultSet.getString("email"),
resultSet.getDate("birthdate")));
}
}
return users;
}
然后只需在业务/域对象中相应地处理它,例如
List<User> users = userDAO.list();
if (!users.isEmpty()) {
int count = users.size();
// ...
}
else {
// Help, no users?
}
编辑4:我设法找出了有问题的依赖关系。在这里: 通过移除此依赖项,TestCase将正确执行并打印出所有可用的字符集。然而,我们确实需要一个数据库驱动程序为我们的应用程序。有人知道sybase jdbc驱动程序出了什么问题吗?
问题内容: 我正在使用加载。 我使用MySQL作为数据源,并且已在ODBC数据源管理器(在Windows 8中)中添加了数据源名称。 这是代码: 输出: 问题答案: 您正在使用Java 8吗?该类不再存在(更多信息)。如果需要使用Java 7,可以安装它。
源代码: 编辑:我的问题是我的MySQL服务器没有监听那个端口,因为当我用phpMyAdmin测试它时,我忘记它运行在同一台机器上。
在java for Edge browser中运行以下测试时,它引发异常。但是chrome浏览器的测试运行成功了,有人能给出关于这个问题的建议吗? java.lang.NullPointerException在Payment.Tests.BaseTest.BeforeMethod(baseTest.java:33)在Sun.Reflect.NativeMethodAccessorImpl.Invo
我正在尝试将Java程序连接到远程Oracle数据库。在网上做了一些研究之后,我决定最简单的方法是使用Oracle JDBC驱动程序。我下载并运行了jar文件,得到了消息“****JCE UNLIMITED STRENGTH已安装*****”问题是,当我尝试将驱动程序添加到我的类路径(javac-classpath ojdbc8.jar Connect.java)时,我不断收到一条错误消息,说“包
我有selenium 2.53.1.jar、platform Windows、Java-1.8、chrome=52.0、chrome-driver.exe-2.23。 在Jenkins上进行夜间观察测试时,我看到了以下消息。 org.openqa.selenium.WebDriverException:未知错误:无法发现打开的页面(驱动信息:chromeDrive=2.23.409699 (49b