首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SimpleJdbcInsert和Sybase发出检索生成的密钥

使用SimpleJdbcInsert和Sybase发出检索生成的密钥
EN

Stack Overflow用户
提问于 2014-10-02 13:10:53
回答 1查看 1.9K关注 0票数 1

我在使用Sybase ( SimpleJdbcInsert.executeAndReturnKey驱动程序)和某些数据时遇到了一个奇怪的问题。

以下列例子为例:

代码语言:javascript
复制
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTemplate)
    .withTableName("TABLE_NAME")
    .usingGeneratedKeyColumns("ID");

List<String> columns = new ArrayList<String>();
    columns.add("SOME_NUMERIC_DATA");
    columns.add("SOME_STRING_DATA");

Map<String, Object> params = new HashMap<String, Object>();
params.put("SOME_NUMERIC_DATA", 10.02);
params.put("SOME_STRING_DATA", "AAAA");

Number insertId = insert.executeAndReturnKey(params);

以上都会失败

代码语言:javascript
复制
DataIntegrityViolationException: Unable to retrieve the generated key for the insert

插入本身很好,就像我执行insert.execute(params)一样,插入将正确工作(但我需要生成的列值)。

如果我为null列插入10.02而不是10.02,那么它将正确工作并返回生成的列值。另外,如果所有字段都是VARCHAR/String,那么它将正确工作。

有人能在这里看到任何可能导致这种情况的字符串和数字字段的组合吗?

我还应该补充一点,当我在H2数据库中使用完全相同的代码时,它一直在工作--这似乎与Sybase/jTDS有关。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-28 18:52:08

我对Server也有同样的问题,并在调用executeAndReturnKey()之前调用此配置方法来修复它

代码语言:javascript
复制
mySimpleJdbcInsert.setAccessTableColumnMetaData(false);

我怀疑这个错误与数据库元数据有关:正如spring http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jdbc.html中所解释的,SimpleJdbcInsert使用数据库元数据来构造实际的insert语句。

您还可以使用SQL OUTPUT子句,例如

代码语言:javascript
复制
INSERT INTO myTable (Name, Age)
OUTPUT Inserted.Id
VALUES (?,?)

并使用一些更通用的JdbcTemplate.execute()来处理插入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26161626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档