Adam
Adam

Reputation: 615

The identifier that starts with '....' is too long. Maximum length is 128

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

Answers (1)

Adam
Adam

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

Related Questions