0

我遇到了 sql 查询的问题,我需要你的帮助 :(。在我的代码中,我想在输入本课程的 id 时显示来自 c#Log 的学生姓名,这是 c#Log 表: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 回答