【问题标题】:Retriving data from different tables in database sending SQL code to be executed, returning data?从数据库中的不同表中检索数据发送要执行的 SQL 代码,返回数据?
【发布时间】:2013-12-22 10:10:04
【问题描述】:

我正在用 Java 制作一个类来连接或与我在其他地方设置的数据库通信。我想对一条语句使用 executeQuery 方法,并接收一个 ResultSet,从中我将检索在 ResultSet 中接收到的信息。

我的问题与 SQL 命令有关,如下所示;我发送到数据库的查询。似乎出了点问题,我在发送命令的那一刻收到了一个 SQLException,这意味着我一定做错了什么。 也许我写错了什么?我不知道,因为我只是尽力遵循为本课程提供的示例指导。

这是我要发送的查询:

"SELECT fr.DepartureLocation, fr.Destination, d.Date, d.Time FROM `FlightRoute` fr,
`Departure` d WHERE d.FlightRouteId = fr.Id AND d.Date > " + dateFrom + " AND
d.Date < " + dateTo + " AND fr.Destination = `" + destination + "`;"

“dateFrom”、“dateTo”和“destination”都是我正在调用的方法的参数,我试图将我从这个语句中得到的结果限制为某个日期范围内的结果以及有一个特定的目的地。 我可能会补充一点,日期是排列在一起的整数,例如:20131205 这应该可以使以后的日期更高。

是我在 SQL 代码中使用参数的方式错误,还是我在这里制作了一般错误的 SQL 代码?

非常感谢任何能够提供正确的 SQL 代码供我使用的人,这样我就可以看到我做错了什么(因为我必须编写更多类似的工作 SQL 语句)! 提前致谢! :)

编辑: 这是我宣布查询并尝试执行它的请求代码:

try
{
    ArrayList<Departure> departures = new ArrayList<>();
    Statement stmt = con.createStatement();
    System.out.println("derp0");
    String query = "SELECT fr.DepartureLocation, fr.Destination, d.Date, d.Time FROM FlightRoute fr, Departure d WHERE d.FlightRouteId = fr.Id AND d.Date > " + dateFrom + " AND d.Date < " + dateTo + " AND fr.Destination = `" + destination + "`;";
    System.out.println("derp0.1");
    ResultSet rs = stmt.executeQuery(query);
    System.out.println("derp1");

作为一个简短的解释,souts 是检查 SQLException 发生的位置,我只能说异常发生在“derp0.1”之后。

【问题讨论】:

  • 能否提供调用查询的堆栈跟踪或一段代码?
  • 我现在添加了您要求的内容。这对解决问题有帮助吗? :S

标签: java mysql sql sql-server jdbc


【解决方案1】:

我建议进行以下更改:

PreparedStatement ps = connection.prepareStatement(
  "SELECT fr.DepartureLocation, fr.Destination, d.Date, d.Time FROM `FlightRoute` fr,"+
  "`Departure` d WHERE d.FlightRouteId = fr.Id AND d.Date > ? AND d.Date < ? "+
  " AND fr.Destination = ?");

ps.setDate(1, dateFrom);
ps.setDate(2, dateTo);
ps.setString(3, destination); //assuming destination is a String 

ResultSet rs = ps.executeQuery();

在 JDBC 中,您应该始终使用参数化,如上所述。它还可以解决您的问题,这可能是由无效的日期格式引起的。

【讨论】:

  • oi44.tinypic.com/i2255d.jpg 我有这个错误,如 prntscr 所示。您是否注意到日期值是整数?我猜 setDate 只有在我使用某种 Date 实现或导入时才有效?
  • 如果 dateFrom 和 dateTo 实际上是整数,并且对应的列是整数,那么使用 ps.setInt(1, dateFrom); setDate() 需要一个 java.sql.Date 对象。
  • 是的,我在写完之前的评论后意识到了这一点。现在似乎一切正常,尽管我不完全理解它如何设法理解问号将在以后被替换,或者其他什么。我几乎没有接触过 SQL 编码的表面,并且还在学习 Java。无论如何,非常感谢您的帮助!在其他类似的情况下,我也应该能够使用这种方式做事。 :)
  • JDBC 将负责将问号交换为实际值,只要您设置正确。由于 SQL 注入攻击,不应该将它们直接放入查询中。见en.wikipedia.org/wiki/SQL_injection
猜你喜欢
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多