Reputation: 615
I try retrive metadata from my MSSQL database, but I get this error:
com.microsoft.sqlserver.jdbc.SQLServerException: The identifier that starts with 'LOCALHOST:1433;CONNECTRETRYINTERVAL=10;CONNECTRETRYCOUNT=1;MAXRESULTBUFFER=-1;SENDTEMPORALDATATYPESASSTRINGFORBULKCOPY=TRUE;DELA' is too long. Maximum length is 128.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:265)
at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:299)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:132)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:37)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:26)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$1ConnectionCommand.doExecute(SQLServerConnection.java:3897)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7730)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3786)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectionCommand(SQLServerConnection.java:3905)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.setCatalog(SQLServerConnection.java:4271)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.switchCatalogs(SQLServerDatabaseMetaData.java:400)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetFromStoredProc(SQLServerDatabaseMetaData.java:349)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetWithProvidedColumnNames(SQLServerDatabaseMetaData.java:374)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getTables(SQLServerDatabaseMetaData.java:561)
at com.zaxxer.hikari.pool.ProxyDatabaseMetaData.getTables(ProxyDatabaseMetaData.java:68)
at com.zaxxer.hikari.pool.HikariProxyDatabaseMetaData.getTables(HikariProxyDatabaseMetaData.java)
at com.scand.bma.querytool.service.MetaDataService.getTablesInfo(MetaDataService.java:52)
This is my connection setting:
spring.datasource.url=jdbc:sqlserver://localhost:1433;DatabaseName=test_mssql;encrypt=true;trustServerCertificate=true;
spring.datasource.username=test
spring.datasource.password=dNZrpWp:0tEEv"JSWGE*
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.show-sql=true
spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.hibernate.ddl-auto=create-drop
This is code when I get error:
try (final Connection connection = jdbcTemplate.getDataSource().getConnection()) {
final Map<String, List<Map<String, Object>>> tablesAndColumns = new LinkedHashMap<>();
final DatabaseMetaData metaData = connection.getMetaData();
final String databaseName = StringUtils.substringAfterLast(connection.getMetaData().getURL(), "/");
result.setTableName(databaseName);
try (final ResultSet tables = metaData.getTables(databaseName.toUpperCase(), null, null, new String[]{"TABLE"})) {
...
}
}
I get the error in this place:
metaData.getTables(databaseName.toUpperCase(), null, null, new String[]{"TABLE"})
I added this dependencies:
implementation group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '11.2.0.jre17'
SQL queries execute perfectly, but I can't get metadata.
Upvotes: 2
Views: 540
Reputation: 615
My problem was in this place:
final String databaseName = StringUtils.substringAfterLast(connection.getMetaData().getURL(), "/");
I waited to see test_mssql
but I would get this: LOCALHOST:1433;CONNECTRETRYINTERVAL=10;CONNECTRETRYCOUNT=1;MAXRESULTBUFFER=-1;SENDTEMPORALDATATYPESASSTRINGFORBULKCOPY=TRUE;DELA
Thanks M. Deinum for comment.
Upvotes: 0