簡體   English   中英

使用SimpleJdbcInsert和Sybase檢索生成的密鑰時出現問題

[英]Issue retrieving generated keys with SimpleJdbcInsert and Sybase

我在使用帶有Sybase(jTDS驅動程序)和某些數據的SimpleJdbcInsert.executeAndReturnKey時遇到了一個奇怪的問題。

請看以下示例:

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);

以上將失敗

DataIntegrityViolationException: Unable to retrieve the generated key for the insert

插入本身很好,就像我執行insert.execute(params) ,插入將正常工作(但我需要生成的列值)。

如果我為SOME_NUMERIC_DATA列插入null而不是10.02 ,則它將正常工作並返回生成的列值。 同樣,如果所有字段都是VARCHAR / String則它將正常工作。

任何人都可以在這里看到任何由字符串和數字字段組合導致的問題。

我還應該補充一點,就是當我在H2數據庫中使用完全相同的代碼時,它始終有效-這似乎與Sybase / jTDS有關

我在使用SQL Server時遇到了同樣的問題,並通過在調用executeAndReturnKey()之前立即調用此配置方法來解決此問題:

mySimpleJdbcInsert.setAccessTableColumnMetaData(false);

我懷疑錯誤與數據庫元數據有關:如spring參考http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jdbc.html中所述 ,SimpleJdbcInsert使用數據庫元數據來構造實際的插入語句。

也可以使用SQL OUTPUT子句,例如

INSERT INTO myTable (Name, Age)
OUTPUT Inserted.Id
VALUES (?,?)

並使用一些更通用的JdbcTemplate.execute()來處理插入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM