public class alldata {
public static void main(String arg[])
{
String str;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","root");
PreparedStatement stmt2;
String sql="select * from RECORDDATA where ID= ? and COMPANY_NM= ?";
stmt2=con.prepareStatement(sql);
int i=5;
str="Audi";
try
{
stmt2.setInt(1, i);
System.out.println("after setting id");
stmt2.setString(2,str);
System.out.println("after setting string");
}
catch(Exception iner)
{
System.out.println("int coulnm"+iner);
}
try
{
ResultSet showdata=stmt2.executeQuery();
System.out.println("after rs");
while(showdata.next())
{
System.out.println("in next");
System.out.println("\n"+showdata.getInt(1)+showdata.getString(2)+showdata.getString(3)+showdata.getString(4)+showdata.getString(5)+showdata.getString(6)+showdata.getString(7));
System.out.println("after next");
}
}catch(Exception e)
{
e.printStackTrace();
}
}catch(Exception e2)
{
e2.printStackTrace();
}
}
}
如果我使用硬编码值ID = 5和COMPANY_NM =奥迪它会从数据库中检索3条记录...但是我的程序会动态地从用户接受这些值...所以这不起作用....请帮助...我陷入了这个阶段......
showdata.next() method
没有执行..虽然数据库中有3条记录。
答案 0 :(得分:1)
如果您希望返回多个记录,为什么我的代码中找不到循环来迭代这些记录?
此外,next()
将检索下一个记录。调用它两次意味着您正在查看第二个检索到的记录。
现在换其他东西:
Java命名约定是类名必须以大写字母开头。
您不需要Class.forName("oracle.jdbc.driver.OracleDriver")
。对于与Java 6或更高版本兼容的JDBC驱动程序,不需要这样做。
删除所有try-catch
语句。您正在捕获错误,然后让代码继续运行,就好像没有错。 不要这样做!
您没有释放资源。使用try-with-resources
可以更好地管理资源。它的使用也更简单。
class Alldata {
public static void main(String arg[]) throws SQLException {
int id = 5;
String name = "Audi";
try (Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "system", "root")) {
String sql = "select * from RECORDDATA where ID= ? and COMPANY_NM= ?";
try (PreparedStatement stmt = con.prepareStatement(sql)) {
stmt.setInt(1, id);
stmt.setString(2, name);
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
System.out.printf("\n%d, %s, %s, %s, %s, %s, %s%n", rs.getInt(1),
rs.getString(2), rs.getString(3), rs.getString(4),
rs.getString(5), rs.getString(6), rs.getString(7));
}
}
}
}
}
}
请注意,您使用的是system
架构。您不应该在系统架构中创建用户表。
用户system
应仅用于数据库维护,例如创建新用户。它永远不应该被应用程序使用。
<强>更新强>
从评论中可以看出,该语句在硬编码时有效,但在使用?
标记时则无效。为了确保我做对了,请尝试以下代码:
class Alldata {
public static void main(String arg[]) throws SQLException {
try (Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "system", "root")) {
String sql1 = "select count(*) from RECORDDATA where ID= ? and COMPANY_NM= ?";
try (PreparedStatement stmt = con.prepareStatement(sql1)) {
stmt.setInt(1, 5);
stmt.setString(2, "Audi");
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next())
System.out.println("Count 1: " + rs.getInt(1));
}
}
String sql2 = "select count(*) from RECORDDATA where ID= 5 and COMPANY_NM= 'Audi'";
try (PreparedStatement stmt = con.prepareStatement(sql2)) {
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next())
System.out.println("Count 2: " + rs.getInt(1));
}
}
}
}
}
它应该打印相同的数字&#34; Count 1&#34;和&#34;计数2&#34;。
答案 1 :(得分:0)
System.out.println(showdata.next());
检索了您的第一条记录。
每次调用.next()
都会向前推动指针。因此,如果您之后没有直接使用检索到的结果,请阻止调用.next()
。