0

SQL クエリの問題に直面しました。あなたの助けが必要です :(。私のコードでは、このコースの ID を入力するときに c#Log から学生の名前を表示したいのですが、これは c#Log テーブルです: HERE そしてこれはコース表です: HERE

これは私のコードです:

public void searchRows() throws ClassNotFoundException, SQLException

{   
     String logName=null;
     Class.forName("com.mysql.jdbc.Driver");
     Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/psd_DB?"
              + "user=root&password=123");

       Scanner s=new Scanner(System.in);
       System.out.println("Enter the course id you want to display its log:");
       courseId=Integer.parseInt(s.nextLine());

       PreparedStatement st1 = (PreparedStatement) con.prepareStatement(" SELECT * FROM courses WHERE courseId="+courseId);
       ResultSet r=(ResultSet) st1.executeQuery();
       while(r.next())

       {
           logName=r.getString("courseName")+"Log";
       }

       //System.out.println(logName);

       PreparedStatement st2 = (PreparedStatement) con.prepareStatement("SELECT "+logName+"."+"studentName FROM "+logName+" INNER JOIN courses ON "+logName+"."+courseId+"="+"courses."+courseId+";");
       st2.executeQuery();

}

2 を入力すると、出力は次の例外になります。

スレッド「メイン」com.mysql.jdbc.exceptions.MySQLSyntaxErrorException での例外:「フィールド リスト」の列「C」が不明です

4

2 に答える 2

0

まず第一に、使用していますがPreparedStatement、それでもコードは SQL インジェクションに対して脆弱です。

次のようにします。

courseId=Integer.parseInt(s.nextLine());

PreparedStatement st1 = (PreparedStatement) con.prepareStatement("   
   SELECT * FROM courses WHERE courseId=?");

st1.setInt(1,courseId);
ResultSet r = st1.executeQuery();

また、例外は自明です:

不明な列Cは、存在しないテーブルから列を選択しようとしていることを意味するため、正しい列にアクセスしているかどうかを確認してください。

回避策: SQL クエリを実行する前に印刷して、どのクエリが実行されているかを確認します (予期した結果が得られたら、この印刷ステートメントを削除できます)。

于 2013-06-23T09:41:53.153 に答える
0

結合は差し迫った問題ではありません-SQLステートメントで不明な列を指定しています。

デバッガーを使用して SQL ステートメントの内容を確認するか、単純にそれらをコンソールに出力して、データベースに対して手動で実行してみてください。

于 2013-06-23T09:42:43.103 に答える