我遇到了SQL查询的问题,我需要你的帮助plz :(。 在我的代码中,我想在输入本课程的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时,输出就是这个例外:
线程“main”中的异常com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:'字段列表'中的未知列'C'
答案 0 :(得分: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查询,以便您知道正在执行哪个查询(您可以在获得预期结果后删除此打印语句)。
答案 1 :(得分:0)
连接不是直接问题 - 您在sql语句中指定了一个未知列。
尝试使用调试器查看SQL语句的内容,或者只是将它们输出到控制台并尝试针对您的数据库手动运行它们