Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC返回空结果集,但数据库中存在记录_Java_Jdbc_Oracle10g - Fatal编程技术网

Java JDBC返回空结果集,但数据库中存在记录

Java JDBC返回空结果集,但数据库中存在记录,java,jdbc,oracle10g,Java,Jdbc,Oracle10g,公共类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");

公共类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=Audi,它会从数据库中检索3条记录…但我的程序会动态地从用户处接受这些值…所以这不起作用…请帮助…我在这个阶段被卡住了。。。
showdata.next()方法不执行。。尽管数据库中存在3条记录。

System.out.println(showdata.next());
检索到了您的第一条记录

.next()
的每次调用都会向前推动指针。因此,如果以后不直接使用检索到的结果,请不要调用
.next()

如果希望返回多条记录,为什么我不能在代码中找到一个循环来迭代这些记录

另外,
next()
将检索下一条记录。调用两次表示您正在查看第二条检索到的记录

现在来看看其他东西:

  • Java命名约定是必须以大写字母开头的类名

  • 您不需要
    Class.forName(“oracle.jdbc.driver.OracleDriver”)
    。兼容Java6或更高版本的jdbc驱动程序不需要这些

  • 删除所有
    try-catch
    语句。您正在捕获错误,然后让代码继续运行,就好像没有任何错误一样。不要这样做

  • 您没有释放资源。使用
    尝试使用资源
    可以更好地管理资源。使用起来也更简单

class所有数据{
公共静态void main(字符串arg[])引发SQLException{
int-id=5;
字符串name=“aud”;
试试(Connection con=DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:xe”、“system”、“root”)){
String sql=“从记录数据中选择*,其中ID=?和COMPANY_NM=?”;
try(PreparedStatement stmt=con.prepareStatement(sql)){
stmt.setInt(1,id);
stmt.setString(2,名称);
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
只能用于数据库维护,例如创建新用户。应用程序绝对不能使用它


更新

从注释中可以看出,语句在硬编码时有效,但在使用
标记时无效。为了确保我正确无误,请尝试以下代码:

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));
                }
            }
        }
    }
}

它应该为“计数1”和“计数2”打印相同的数字。

这三个记录中有多少记录的ID=5和COMPANY\u NM='Audi'?另外,您正在调用
rs.next()
两次。有3条记录存在,ID=5,COMPANY_NM='Audi';请尝试硬编码查询以删除更多代码,因为从视觉上看一切正常。正常工作……但它只获取一条记录……(如我所述,数据库中有3条记录…@NorbertvanNobelen,如果(showdata.next())替换为while(showdata.next())to itrate循环只给出2条记录:(…现在它获取硬编码值的3行记录…)…但我的程序动态地接受用户的值。所以硬编码值对我的程序没有用…您用重试了吗?但现在这一点起作用了吗?它应该在您构建它的过程中起作用。@Norbert van Nobelen是的..用?.尝试了(shodata.next())一点也不例外……正如您所建议的,我对代码进行了更改,但在线程“main”java.sql.SQLException中出现了异常:没有找到适合jdbc的驱动程序:oracle:thin:@localhost:1521:xe正如您所说,为什么我不能使用循环来迭代记录……这不是必需的,因为.next()方法本身就是一个循环,它会迭代直到所有记录都出现在数据库中,如SQL查询本身所述……您使用的JDBC驱动程序的版本是什么?
ojdbc6.jar
ojdbc7.jar
文件应该自动注册。
ojdbc14.jar
是古老的,所以不要使用它。--至于您的第二条评论,我很困惑。
 next()
不是循环。
虽然
是循环,但使用
next()
调用检索下一条记录,直到
next()
返回false表示没有更多记录。这与Java的
Iterator
的工作原理非常相似,只是Iterator有两个方法,一个用于检查是否存在更多记录(
hasNext()
)和一个用于检索下一条记录的(
next()
)。请参见两者都使用
next()
。正如您所说,我还将ojdbc7.jar添加到库中……结果相同……不在while循环中输入……(:(如果使用硬编码值,例如,id=5和company_nm=Audi,使用相同的while循环获取数据库中的所有三条记录…但是当我将动态值传递给sql查询时,循环不会被执行…也在调试模式下尝试..调试程序忽略while循环的执行..resultset获取其中的所有记录,然后执行next()方法用于从resultset检索数据。。