草庐IT

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

coder 2024-03-13 原文

我试图在使用 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)
);

最佳答案

The Oracle JDBC documentation说:

If key columns are not explicitly indicated, then Oracle JDBC drivers cannot identify which columns need to be retrieved. When a column name or column index array is used, Oracle JDBC drivers can identify which columns contain auto-generated keys that you want to retrieve. However, when the Statement.RETURN_GENERATED_KEYS integer flag is used, Oracle JDBC drivers cannot identify these columns. When the integer flag is used to indicate that auto-generated keys are to be returned, the ROWID pseudo column is returned as key. The ROWID can be then fetched from the ResultSet object and can be used to retrieve other columns.

您没有指定列(如他们的示例代码所示),因此您正在检索 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) 将检索该数值。

关于java - 为什么请求无效转换错误代码 : 17132?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32112907/

有关java - 为什么请求无效转换错误代码 : 17132?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  4. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  5. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  6. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  7. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  8. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  9. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  10. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

随机推荐