Hey,
het gaat over test automation code. De DB code is opgezet door een dev die niet meer in het team zit en spijtig genoeg heb ik weinig Spring kennis.
Ik heb problemen om via mijn code Chinese characters in de DB te inserten.
VALUELOCDESC kolom is een NCHAR in de Oracle 19c tabel.
Dit is mijn code om een DataSource bean te configureren:
Regels 13-16 heb ik toegevoegd om unicode to the laten, maar geen succes, bleef omgekeerde vraagtekens hebben na de insert.
Dan heb ik mijn query aangepast om de Chinese characters juist te gebruiken:
unistr() lustte hij ook niet, gaf me altijd omgekeerde vraagtekens.
In DBeaver lukte deze query wel:
Dus met een N voor de Chinese characters, daarop mijn java code aangepast:
Maar dat geeft me de volgende error bij runnen:
SQL state [99999]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type
Ik denk dat ik dus mijn code ergens wijs moet maken dat VALUELOCDESC een NCHAR type is, maar hoe?
het gaat over test automation code. De DB code is opgezet door een dev die niet meer in het team zit en spijtig genoeg heb ik weinig Spring kennis.
Ik heb problemen om via mijn code Chinese characters in de DB te inserten.
VALUELOCDESC kolom is een NCHAR in de Oracle 19c tabel.
Dit is mijn code om een DataSource bean te configureren:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public DataSource dataSourceBis() { logger.debug("Spring bean 'dataSource' created, configured in the testing module"); String dbHost = EnvironmentSpecificConfiguration.from(environmentVariables).getProperty("db.host"); String dbUser = EnvironmentSpecificConfiguration.from(environmentVariables).getProperty("db.bis.user"); String dbPassword = EnvironmentSpecificConfiguration.from(environmentVariables).getProperty("db.bis.password"); DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(oracle.jdbc.driver.OracleDriver.class.getName()); dataSource.setUrl(dbHost); dataSource.setUsername(dbUser); dataSource.setPassword(dbPassword); Properties properties = new Properties(); properties.setProperty("spring.datasource.hikari.data-source-properties.useUnicode", "yes"); properties.setProperty("spring.datasource.hikari.data-source-properties.characterEncoding", "UTF-8"); properties.setProperty("spring.datasource.hikari.data-source-properties.sqlScriptEncoding", "UTF-8"); dataSource.setConnectionProperties(createUnicodeProperties()); return dataSource; } |
Regels 13-16 heb ik toegevoegd om unicode to the laten, maar geen succes, bleef omgekeerde vraagtekens hebben na de insert.
Dan heb ik mijn query aangepast om de Chinese characters juist te gebruiken:
Java:
1
2
3
4
5
6
7
8
9
10
11
| SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(parameterI18N); String insertSql = "INSERT INTO TBLI18N (" + "PARAMID, VALUELOCDESC, PARAMETERDESC, ICDSID, CHANGETS" + ") VALUES (" + ":parameter, unistr(:value), :description, :updatedById, :updatedTimestamp)"; KeyHolder keyHolder = new GeneratedKeyHolder(); String[] generatedIdFields = {"NIDTBLI18N"}; getNamedParameterJdbcTemplate().update(insertSql, namedParameters, keyHolder, generatedIdFields); |
unistr() lustte hij ook niet, gaf me altijd omgekeerde vraagtekens.
In DBeaver lukte deze query wel:
SQL:
1
| INSERT INTO TBS085 (PARAMID, VALUELOCDESC, PARAMETERDESC, ICDSID) VALUES ('TEST1', N'点燃式四冲程', 'Parameter of Auto Test', 'MJORDAN') |
Dus met een N voor de Chinese characters, daarop mijn java code aangepast:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(parameterI18N); String insertSql = "INSERT INTO TBLI18N (" + "PARAMID, VALUELOCDESC, PARAMETERDESC, ICDSID" + ") VALUES ('" + parameterI18N.getParameter() + "', " + "N'" + parameterI18N.getValue() + "', '" + parameterI18N.getDescription() + "', '" + parameterI18N.getUpdatedById() + "')"; KeyHolder keyHolder = new GeneratedKeyHolder(); String[] generatedIdFields = {"NIDTBLI18N"}; getJdbcTemplate().update(insertSql, keyHolder, generatedIdFields); |
Maar dat geeft me de volgende error bij runnen:
SQL state [99999]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type
Ik denk dat ik dus mijn code ergens wijs moet maken dat VALUELOCDESC een NCHAR type is, maar hoe?