这是我插入行的代码。列是:主要ID,名称和艺术家。
我是否正确传递了主要ID,因为它一直在给我一个错误?它被设置为1,并且每次添加行时它都会递增。
try {
//Database
String query = "INSERT INTO lyrics1(lyrics1_id, name, artist) values(?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(2, nameOfSong.getText()); // set input parameter 2
statement.setString(3, artist.getText());
statement.setLong(i, i);
ResultSet rs = statement.executeQuery("SELECT * FROM lyrics1");
while (rs.next()){
System.out.println(rs.getString(1));
}
statement.execute();
rs.close();
statement.close();
connection.close();
i++;
} catch (SQLException insertException) {
displaySQLError(insertException);
}
错误是:
SQLException: No value specified for parameter 1 SQLState: 07001 VendorError: 0
答案 0 :(得分:4)
如果你的主键是AUTO_INCREMENT
,它听起来就是这样,你没有用INSERT
语句传递它,它会自动为你处理。这就是你想要做的事情:
INSERT INTO lyrics1(name, artist)
VALUES(?, ?)
答案 1 :(得分:3)
(这假设您的主键不是 AUTO_INCREMENT
,并且您出于某种原因正在传递它。)
我认为你有一个简单的拼写错误:
statement.setLong(i, i);
应该是
statement.setLong(1, i);
// ^-- 1, not i
作为一个老傻瓜,我也可能会将这个陈述高于其他两个,所以你要按顺序进行。
答案 2 :(得分:2)
如果您在主键中有自动增量:
String query = "INSERT INTO lyrics1(name, artist) values(?, ?)";
答案 3 :(得分:0)
在插入TEXT或VARCHAR值时不要忘记添加引号,例如“INSERT INTO lyrics1(lyrics1_id,name,artist)VALUES(”id“,”name“,”artist“)。
此外,如果密钥是自动增量的,请不要传递它,SQL将自行完成。然后查询应该是“INSERT INTO lyrics1(name,artist)VALUES(”name“,”artist“)。”
答案 4 :(得分:0)
据我所知,你应该有一个;在最后的字符串中如下:
String query =“INSERT INTO lyrics1(lyrics1_id,name,artist)values(?,?,?)”;
然而,无论如何它都可能有效。答案 5 :(得分:0)
您在为主键设置值的行上有拼写错误:
statement.setLong(i, i);
在这里,您是否看到了第一个参数,它是i
而不是1
。所以必须改为
statement.setLong(1, i);
但是,如果您再次运行该程序,如果i
的值初始化为常量,则会出现主键违例异常。因为,您正在使用MySQL,并且如果您使用AUTO_INCREMENT
作为主键列,那么您可以在INSERT
查询中避免使用该字段。 MySQL将自动为该字段分配值。所以你可以使用这样的东西:
INSERT INTO lyrics1(name, artist) values(?, ?)