当前位置: 首页 > 面试题库 >

为什么无效的转换请求了错误代码:17132?

屠嘉勋
2023-03-14
问题内容

我正在尝试使用JDBC准备的语句进行插入时获取最后插入的行ID。我有一个自动增量主键列作为表中的标识列。我的代码如下:

public static String insertMeetingToDB(String organizer,String subject,String location,String start_date_time,String end_date_time,String description) throws Exception {
    Connection dbConnection = null;
    PreparedStatement preparedStatement = null;
    Integer last_inserted_id=0;


String insertTableSQL = "INSERT INTO MEETINGS"
                   + "(ORGANIZER_EMAIL, SUBJECT, MEETING_LOCATION, START_DATE_TIME, END_DATE_TIME, MEETING_DESCRIPTION) VALUES"
                   + "(?,?,?,?,?,?)";

SimpleDateFormat from = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
from.setTimeZone(TimeZone.getTimeZone("IST"));  //--CONVERTING DATE/TIME TO INDIAN STANDARD TIME

SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss");

Date input_start_date_val =  from.parse(start_date_time);
Date input_end_date_val =  from.parse(end_date_time);

String input_start_date =  datetimeFormat.format(input_start_date_val);
String input_end_date =  datetimeFormat.format(input_end_date_val);

try {

        dbConnection = getConnection();

        //--INSERTING MEETING DETAILS
        preparedStatement = dbConnection.prepareStatement(insertTableSQL, preparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, organizer);
        preparedStatement.setString(2, subject); 
        preparedStatement.setString(3, location);
        preparedStatement.setTimestamp(4, java.sql.Timestamp.valueOf(input_start_date));
        preparedStatement.setTimestamp(5, java.sql.Timestamp.valueOf(input_end_date));
        preparedStatement.setString(6, description);

        // execute insert SQL stetement
        preparedStatement.executeUpdate();

        ResultSet rs = preparedStatement.getGeneratedKeys();
        if(rs.next())
        {
            last_inserted_id = rs.getInt(1);
        }

        return last_inserted_id.toString();

} catch (SQLException e) {
        return e.getMessage()+" ERROR CODE: "+e.getErrorCode();
} finally {
        if (preparedStatement != null) {
                preparedStatement.close();
        }
        if (dbConnection != null) {
                dbConnection.close();
                dbConnection = null; 
        }
  }
}

如果删除此行,则不会出现此错误:

last_inserted_id = rs.getInt(1);

但是在谷歌搜索之后,使用此代码似乎没问题,它应该返回我上次插入的行ID。

表说明:

CREATE TABLE MEETINGS (
  MEETING_ID  NUMBER GENERATED ALWAYS AS IDENTITY,
  ORGANIZER_EMAIL VARCHAR2(100),
  SUBJECT VARCHAR2(250),
  START_DATE_TIME TIMESTAMP,
  END_DATE_TIME TIMESTAMP,
  ATTENDEES_LIST_CONFIDENTIAL CHAR(1),
  ATTENDEES_CONF_CONFIDENTIAL CHAR(1),
  ATTENDEES_COUNT_INTERNAL NUMBER(11),
  ATTENDEES_COUNT_EXTERNAL NUMBER(11),
  CONFIRMED_COUNT_INTERNAL NUMBER(11),
  CONFIRMED_COUNT_EXTERNAL NUMBER(11),
  PREVIOUS_MEETING_ID NUMBER(20),
  APPOINTMENT_SOURCE CHAR(1),
  MEETING_LOCATION VARCHAR(100),
  LATITUDE FLOAT(10),
  LONGITUDE FLOAT(10),
  MEETING_DESCRIPTION VARCHAR2(1000),
  PRIMARY KEY(MEETING_ID)
);

问题答案:

Oracle
JDBC文档
说:

如果未明确指示键列,则Oracle JDBC驱动程序将无法识别需要检索的列。使用列名或列索引数组时,Oracle
JDBC驱动程序可以识别哪些列包含要检索的自动生成的键。但是,使用Statement.RETURN_GENERATED_KEYS整数标志时,Oracle
JDBC驱动程序无法识别这些列。当使用整数标志指示要返回自动生成的键时,将ROWID伪列作为键返回。然后ROWID可以从ResultSet对象中获取,并且可以将其用于检索其他列。

您没有指定列(如其示例代码中所示),因此正在检索ROWID;。尝试使用getInt()它会导致您看到错误。(我实际上看到了,Invalid column type: getInt not implemented for class oracle.jdbc.driver.RowidAccessor ERROR CODE: 17004但我认为这取决于不同的驱动程序版本)。

您需要指定获取自动生成的值的列。如果它被调用,MEETING_ID那么您将执行以下操作:

    String returnCols[] = { "MEETING_ID" };
    preparedStatement = dbConnection.prepareStatement(insertTableSQL, returnCols);

…传递列的数组-在这种情况下仅传递一个-而不是RETURN_GENERATED_KEYS标志。

rs.getInt(1)则将检索该数值。



 类似资料:
  • 注释了println语句,但未注释unicode。为什么?

  • 如果字段根本不存在,是否应将其视为?

  • http://maps.googleapis.com/maps/api/directions/json?origin=Central香港 在没有mode=transit参数的情况下,请求可以正常工作,但结果只包括驾驶方向。添加最后一个参数后,我得到: "状况":"INVALID_REQUEST" 我能做些什么来使这个工作?有明确的交通选项,它们列在谷歌地图上。

  • 问题内容: 我被告知不要像这样添加内容: 这有什么问题?我还有什么其他选择? 问题答案: 每次设置时,都必须解析HTML,构造DOM并将其插入文档中。这需要时间。 例如,如果有数千个div,表,列表,图像等,则调用将导致解析器重新重新解析 所有这些内容 。这也可能破坏对已经构造的DOM元素的引用,并引起其他混乱。实际上,您要做的就是在末尾附加一个新元素。 最好只致电: 这样,将不会再次解析的现有内

  • 我需要为mvc项目使用Amazon弹性转码器。我想通过文档中描述的http请求使用它。在创建请求头时,我需要创建授权参数,正如我所描述的,我想我已经创建了。但是响应返回这个错误;我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅维修文档。 请求的主机参数为=elastictranscoder.us-east-1.amazonaws.com:443 帖

  • 问题内容: 我似乎找不到解决此问题的方法。我正在做的是声明一个整数,它告诉我代码不可访问。 问题答案: 一旦使用方法,您将返回到首先调用该方法的方法。返回后放置的任何语句都是没有意义的,因为那是在不严重违反程序计数器的情况下无法到达的代码(在Java中可能是不可能的)。