【问题标题】:Column is either not in any table in the FROM list Java database searching列不在 FROM 列表中的任何表中 Java 数据库搜索
【发布时间】:2018-05-27 04:16:06
【问题描述】:

我正在使用 Java 编写一个数据库程序,但我遇到了一个问题,它告诉我我正在搜索的内容不在表中。

public static void displayRecord(ResultSet rs) throws SQLException
{
    String assignment = rs.getString("assignment");
    int grade = rs.getInt("grade");
    System.out.println(assignment + " | " + grade + "\n");
}

public void findGrade(String assignment){

    String assignString;
    int gradeInt;

    try{
        Class.forName(driver).newInstance();
    }
    catch (Exception err){
        System.err.println("Unable to load the embedded driver.");
        err.printStackTrace(System.err);
        System.exit(0);
    }
    Connection connected = null;

    try{

        int ble = 25;
        connected = DriverManager.getConnection(protocol + databaseName);

        Statement statement = connected.createStatement();

        ResultSet rs = null;

        rs = statement.executeQuery("SELECT assignment, grade FROM student WHERE assignment = " + assignment);

        if(rs == null ) {
            System.out.println("Assignment not found!");
        }
        else {
            displayRecord(rs);
        }

        rs.close();

        connected.close();


    }

    catch (SQLException err){
        System.err.println("SQL error.");
        err.printStackTrace(System.err);
        System.exit(0);
    }
}

它最终给了我以下错误

SQL 错误。 java.sql.SQLSyntaxErrorException:列 'ASSIGNMENT1' 不在 FROM 列表中的任何表中,或者出现在连接规范中并且超出连接规范的范围,或者出现在 HAVING 子句中并且不在 GROUP BY 列表中。如果这是 CREATE 或 ALTER TABLE 语句,则“ASSIGNMENT1”不是目标表中的列。 在 org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(未知来源) 在 org.apache.derby.impl.jdbc.Util.generateCsSQLException(未知来源) 在 org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(未知来源) 在 org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(未知来源) 在 org.apache.derby.impl.jdbc.EmbedConnection.handleException(未知来源) 在 org.apache.derby.impl.jdbc.ConnectionChild.handleException(未知来源) 在 org.apache.derby.impl.jdbc.EmbedStatement.execute(未知来源) 在 org.apache.derby.impl.jdbc.EmbedStatement.executeQuery(未知来源) 在 Student.findGrade(Student.java:153) 在 GradeBookTester.main(GradeBookTester.java:17)

我不确定为什么它给了我数据库中存在的错误。

我会为测试人员和数据库创建者自己提供代码,看看那里是否有错误,但这一切看起来都很可靠。

数据库:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class CreateGradeBook{

private static final String driver = "org.apache.derby.jdbc.EmbeddedDriver";
private static final String protocol = "jdbc:derby:";

public static void main(String[] args)
{
    try{
        Class.forName(driver).newInstance();
        System.out.println("Loaded the embedded driver.");
    }
    catch (Exception err){
        System.err.println("Unable to load the embedded driver.");
        err.printStackTrace(System.err);
        System.exit(0);
    }

    String dbName = "GradeBook";
    Connection connected = null;

    try{
        System.out.println("connecting to and creating the database...");
        connected = DriverManager.getConnection(protocol + dbName + ";create=true");
        System.out.println("database created.");

        Statement statement = connected.createStatement();

        statement.execute("CREATE TABLE student" + "(student_name varchar(50), student_id int, assignment varchar(80), grade int)");
        System.out.println("created Student table.");


        connected.close();
    }

    catch (SQLException err){
        System.err.println("SQL error.");
        err.printStackTrace(System.err);
        System.exit(0);
    }
}

}

这是测试仪的代码

public class GradeBookTester {

public static void main(String[] args) {
    Student bob = new Student();

    bob.setStudentName("Bob");
    bob.setStudnetID(12345);

    bob.addGrade("ASSIGNMENT1", 100);
    bob.addGrade("assignment2", 50);
    bob.addGrade("assignment3", 25);
    bob.addGrade("assignment4", 100);

    bob.displayGrades();

    bob.findGrade("ASSIGNMENT1");
}

}

【问题讨论】:

  • 您的问题准备非常好,但切勿在代码中使用显式 sql 来防止 sql 注入危险。请改用过程调用。

标签: java sql database


【解决方案1】:

您必须用引号提及搜索字符串,如下所示,

rs = statement.executeQuery("SELECT assignment, grade FROM student WHERE assignment = '" + assignment + "'");

问题是您的查询被解释如下,

SELECT assignment, Grade FROM student WHERE assignment=ASSIGNMENT1

而不是

SELECT assignment, Grade FROM student WHERE assignment = 'ASSIGNMENT1'

使查询解释器将其视为列而不是值

【讨论】:

  • 啊 okie dokie,是的,这很有意义,我不敢相信我错过了。非常感谢!
猜你喜欢
  • 2010-10-17
  • 2016-02-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多