2017-12-13 19 views
4

私はJavaのデータベースプログラムで作業していますが、私が探しているものが見つかりませんでしたテーブル。カラムがFROMリストのどのテーブルにもありません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'はターゲット表の列ではありません。 at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(不明なソース) at org.apache.derby.impl.jdbc.Util.generateCsSQLException(不明なソース) at org.apache.derby.impl.jdbc。 org.apacheでorg.apache.derby.impl.jdbc.EmbedConnection.handleException(不明なソース) でorg.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(不明なソース) でTransactionResourceImpl.wrapInSQLException(不明なソース) .derby.impl.jdbc.ConnectionChild.handleException(不明なソース) at org.apache.derby.impl.jdbc.EmbedStatement.execute(不明なソース) at org.apache.derby.impl.jdbc.EmbedStatement.executeQuery(不明なソース)ソース) at Student.findGrade(Student.java:153) a t 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"); 
} 

} 
+0

質問準備はとても良いですが、SQLインジェクションの危険に対してコード内で明示的な括弧を使用しないでください。代わりにプロシージャ呼び出しを使用します。 –

答えて

1

するためのコードで、

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

oblemはあなたのクエリが

SELECT割り当て、学生からのグレード、以下のように解釈しまっているWHERE代入= ASSIGNMENT1

ではなく

SELECT割り当て、割り当て学生FROMグレード= 「割り当て1」

クエリインタープリタを値としてではなく列として考えるようにします

+0

ああ、okie dokie、ええ、それは私がそれを逃したと信じていない多くの意味がありません。どうもありがとうございました! –

関連する問題