【问题标题】:Updating row in JDBC更新 JDBC 中的行
【发布时间】:2014-07-27 00:46:14
【问题描述】:

我目前正在尝试创建一个 java 文件以允许基本用户界面连接到 derby 客户端服务器。我需要更新学生课程表中的一行,用户将知道学生 ID (SID),并且可能需要输入学生课程 1、2 和 3 以及课程费用 1、2、3 并将它们更改为输入的新数据。并且学生课程 ID SCID 和 SID 目前应该保持不变我正在使用方法从用户那里获取数据并将这些数据存储在 Java 中的变量中,然后我需要能够通过 SID 搜索但不能更改它然后输入剩余数据。 我一直在尝试使用准备好的语句来实现这一点,但我遇到了问题。

---SQLException Caught---

  SQLState:   XCL14
  Severity: 20000
  Message:  The column position '10' is out of range.  The number of columns for t
        his ResultSet is '9'.
  java.sql.SQLException: The column position '10' is out of range.  The number of
  columns for this ResultSet is '9'.
    at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unkn
  own Source)
    at org.apache.derby.client.am.SqlException.getSQLException(Unknown Sourc
  e)
    at org.apache.derby.client.am.ColumnMetaData.getColumnType(Unknown Sourc
  e)
    at org.apache.derby.client.am.PreparedStatement.setString(Unknown Source
  )
          at StudentPayments.main(StudentPayments.java:186)
  Caused by: org.apache.derby.client.am.SqlException: The column position '10' is
  out of range.  The number of columns for this ResultSet is '9'.
    at org.apache.derby.client.am.ColumnMetaData.checkForValidColumnIndex(Un
  known Source)
    ... 3 more
  Students database finishing. . . .

这是表的架构

CREATE TABLE STUDENT_COURSES
(SCID INT NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    SID INT ,
    CID1 INT ,
    CID2 INT ,
    CID3 INT ,
    CC1 INT ,
    CC2 INT ,
    CC3 INT ,
    TOTAL INT ,
    foreign key (SID) references STUDENT(SID),
    foreign key (CID1) references COURSES(CID),
    foreign key (CID2) references COURSES(CID),
    foreign key (CID3) references COURSES(CID),
    UNIQUE (TOTAL)
    );

这是我在 Java 中所拥有的,但它不起作用

PreparedStatement scUpdate;
ResultSet StudentCourse;
String SCID, CID1, CID2, CID3, CC1, CC2, CC3;
String studentTotalCost;
String responseSC;

stuUpdate = connect.prepareStatement("UPDATE STUDENT SET FIRSTNAME = ?, LASTNAME = ?, DOB = ?, ADDRESS = ?, SUBURB = ?, PROVINCE = ?, POSTCODE = ?, PHONE = ?, EMAIL = ? WHERE SID = ?");

responseSC=getTableChoiceFromUser();
if( ( responseSC.substring(0,1).equals("3") || responseSC.substring(0,Math.min(responseSC.length(),mUpdate.length())).toUpperCase().equals(mUpdate) ))
//checks the Users selection                        
{
    SID = getStudentSIDFromUser();
    if(! SID.substring(0,Math.min(SID.length(),mEXIT.length())).toUpperCase().equals(mEXIT) )
    //checks to make sure User does not want to exit this step and return to start.
    {
        CID1 = getCIDFromUser();
        CID2 = getCIDFromUser();
        CID3 = getCIDFromUser();
        CC1 = getCCFromUser();
        CC2 = getCCFromUser();
        CC3 = getCCFromUser();
        SCID = getCIDFromUser();
        studentTotalCost = CC1 + CC2 + CC3;
        scUpdate.setString(1, SID);
        scUpdate.setString(2, CID1);
        scUpdate.setString(3, CID2);
        scUpdate.setString(4, CID3);
        scUpdate.setString(5, CC1);
        scUpdate.setString(6, CC2);
        scUpdate.setString(7, CC3);
        scUpdate.setString(8, studentTotalCost);
        scUpdate.setString(9, SCID);
        scUpdate.executeUpdate();
        System.out.println(Bar);
        System.out.println("Students Courses Successfully Updated.");
        System.out.println(Bar);
    }

【问题讨论】:

  • 你忘记commit更新了吗?
  • 自动提交没有关闭,所以应该自动提交。
  • 是否有错误或异常?你的问题究竟是什么?
  • 对不起,我忘了提及我遇到的异常。我已经更新了问题。
  • 照原样,您的代码为表STUDENT 准备语句stuUpdate,并为表scUpdate 使用STUDENT_COURSES,您没有显示它是如何准备的。没有它就无法提供更多帮助。

标签: java jdbc derby


【解决方案1】:

异常代码看起来很奇怪,因为您没有引用任何“?”声明中没有。但是请注意,您只为语句提供了 9 个参数而不是 10 个 - 这可能会导致问题。

【讨论】:

  • 我认为通过提供第 10 个参数,我可以将第 10 个参数用作“where SID = ?”的值这不是这样做的方法吗?如果不是,我该如何更改它以允许它按用户输入的 SID 进行搜索?谢谢
  • 您的最后一个参数应该对应于语句中的最后一个,即“where SID = ?”。看这里的例子:mkyong.com/jdbc/jdbc-preparestatement-example-update-a-record。如果您的 SID 列是 INT,您应该在调用 executeUpdate() 之前在 PreparedStatement 上添加 setInt() 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2018-02-19
  • 1970-01-01
  • 2020-11-12
相关资源
最近更新 更多