好的,所以我刚开始使用德比客户端的JDBC,而且我对它有点新意。
我将列ID设置为主键,使用int作为其数据类型。但是,我不确定是否应该包含myStatement.setString(1, ?);
,因为我认为它应该是自动增量,但看起来它没有这样做。
这是我的Grab文件详情:
create table "ADMIN1".STUDENTPERSONALDETAILS
(
ID INTEGER not null primary key,
STUDENTID VARCHAR(10) not null,
LASTNAME VARCHAR(50) not null,
FIRSTNAME VARCHAR(50) not null,
MIDDLENAME VARCHAR(50) not null,
PLACEOFBIRTH VARCHAR(200) not null,
DOB VARCHAR(50) not null,
GENDER VARCHAR(4) not null,
CIVILSTATUS VARCHAR(7) not null,
RELIGION VARCHAR(15) not null,
NATIONALITY VARCHAR(20) not null
)
如何更正我的PreparedStatement
或我的表格,以便自动添加列ID值,以便我可以启动setString(2, studentID)
并避免收到有关列数的错误与所提供的相匹配?
这是我的代码:
addButton.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent e) {
try {
String myDbUrl = "jdbc:derby://localhost:1527/Enrollment"; //stores url to string
String userName = "admin1";
String Password = "admin1";
Connection myDBConnection = DriverManager.getConnection(myDbUrl, userName, Password);
String myQuery = "INSERT INTO STUDENTPERSONALDETAILS"
+ "(STUDENTID,LASTNAME,FIRSTNAME,MIDDLENAME,PLACEOFBIRTH,DOB,GENDER,CIVILSTATUS,RELIGION,NATIONALITY) "
+ "VALUES(?,?,?,?,?,?,?,?,?,?) ";
String adminissionNo ;
String studentID = tfStudentId.getText().toString();
String lastName = tfLastName.getText().toString();
String firstName = tfFirstName.getText().toString();
String middleName = tfMiddleName.getText().toString();
String placeOfBirth = tfPob.getText().toString();
String dateOfBirth = listDOB.getSelectedItem().toString();
String gender = listGender.getSelectedItem().toString();
String civilStatus = listCivilStatus.getSelectedItem().toString();
String religion = listReligion.getSelectedItem().toString();
String nationality = listNationality.getSelectedItem().toString();
PreparedStatement myStatement = myDBConnection.prepareStatement(myQuery);
myStatement.setString(2, lastName);
myStatement.setString(3, firstName);
myStatement.setString(4, middleName);
myStatement.setString(5, placeOfBirth);
myStatement.setString(6, dateOfBirth);
myStatement.setString(7, gender);
myStatement.setString(8, civilStatus);
myStatement.setString(9, religion);
myStatement.setString(10, nationality);
boolean insertResult = myStatement.execute();
if(insertResult == true)
JOptionPane.showMessageDialog(null, "Successfully Added Information");
else
JOptionPane.showMessageDialog(null, "Encountered an error while inserting data");
}
catch(SQLException ex) {
JOptionPane.showMessageDialog(null, ex.toString());
}
}
});
是否需要在主键中加入myStatement.setString(1, integervaluehere)
?它不应该自动增量吗?
我很感激任何解释,因为我刚开始学习PreparedStatements
的基础知识。
我尝试对列进行计数并尝试了10行和11行myStatement.setString()
,但由于不匹配,仍然无法插入数据。
提前致谢。
答案 0 :(得分:2)
您需要提及'自动增量'明确。 或者您可以编写自己的Java代码来跟踪每个表的Id,每当您要求方法提供ID时,它将返回lastID + 1.
但是,我想现在你可以使用auto_increment选项了。
答案 1 :(得分:2)
如果您想要自动增量,您需要在列定义中说明,而且您还没有。
我不知道'默认1'在你的标题中应该是意思,因为你没有在你的问题中提到它,但你不能有默认值和自动增量。它没有意义。
我不知道什么'存储种子1'在你的编辑中意味着。
当你有一个你希望依赖或自动增量的默认值的列时,你根本就没有在INSERT语句中提及它,所以没有设置位置参数。
答案 2 :(得分:1)
首先,将主标识符列设置为自动增量。由于您的查询已排除主键,因此您只需更改PreparedStatement
索引以匹配查询starting from one中的参数数量。
由于除了主ID
列之外您还有10列,因此PreparedStatement
可能如下所示:
PreparedStatement myStatement = myDBConnection.prepareStatement(myQuery);
myStatement.setString(1, studentId);
myStatement.setString(2, lastName);
myStatement.setString(3, firstName);
myStatement.setString(4, middleName);
myStatement.setString(5, placeOfBirth);
myStatement.setString(6, dateOfBirth);
myStatement.setString(7, gender);
myStatement.setString(8, civilStatus);
myStatement.setString(9, religion);
myStatement.setString(10, nationality);
请注意,一旦将表中的主键更改为自动递增,就不需要使用指令myStatement.setInt(1, primaryId);
。但是,如果您选择将主键保持为非自动增量,则必须显式指定主键值并在查询中提供参数以插入该数据。
答案 3 :(得分:-1)
如果您正在使用MySQL Workbench,如果您不这样做,我强烈推荐,因为它只是有效。您必须选择自动增量作为该列的特征。如果希望列自动递增,则在数据库中创建列时,请选中自动递增选项,有时写为AI。