java - Microsoft SQL JDBC driver v6.2 returning incorrect SQL type code for DATETIME fields -


normally, resultsetmetadata#getcolumntype() should return 93 datetime fields (usually represented java.sql.timestamp).

this indeed true driver versions 4.2.6420.100 , 4.0.4621.201 (as jtds).

when using newer microsoft jdbc drivers (6.0.7728.100, 6.0.8112.100 , 6.2.1.0 in partucular) microsoft sql server 2005 (9.0.1399), observe different type code returned: -151, doesn't map type in java.sql.types.

at same time, resultsetmetadata#getcolumnclassname(int) , resultsetmetadata#getcolumntypename(int) behave correctly (always returning java.sql.timestamp , datetime, respectively).

here's unit test fails when run using above driver , server combinations:

package com.example;  import static org.hamcrest.matcherassert.assertthat; import static org.hamcrest.matchers.is;  import java.sql.connection; import java.sql.resultset; import java.sql.resultsetmetadata; import java.sql.sqlexception; import java.sql.statement; import java.sql.types;  import javax.sql.datasource;  import org.eclipse.jdt.annotation.nullable; import org.testng.annotations.aftermethod; import org.testng.annotations.beforeclass; import org.testng.annotations.beforemethod; import org.testng.annotations.test;  import com.microsoft.sqlserver.jdbc.sqlserverconnectionpooldatasource;  public final class mssqlservertest {     @nullable     private static datasource datasource;      @nullable     private connection conn;      @beforeclass     public static void setuponce() {         datasource = new sqlserverconnectionpooldatasource();         ((sqlserverconnectionpooldatasource) datasource).seturl("jdbc:sqlserver://localhost\\sqlexpress:1433;databasename=...");     }      @beforemethod     public void setup() throws sqlexception {         this.conn = datasource.getconnection("...", "...");     }      @aftermethod     public void teardown() throws sqlexception {         if (this.conn != null) {             this.conn.close();         }         this.conn = null;     }      @test     public void testdatetimecode() throws sqlexception {         try (final statement stmt = this.conn.createstatement()) {             try {                 stmt.executeupdate("drop table test");             } catch (@suppresswarnings("unused") final sqlexception ignored) {                 // ignore             }             stmt.executeupdate("create table test (value datetime)");              try (final resultset rset = stmt.executequery("select * test")) {                 final resultsetmetadata metadata = rset.getmetadata();                 assertthat(metadata.getcolumnclassname(1), is(java.sql.timestamp.class.getname()));                 assertthat(metadata.getcolumntypename(1), is("datetime"));                 assertthat(metadata.getcolumntype(1), is(types.timestamp));             }         }     } } 

the above issue doesn't occur newer microsoft sql server versions (like 2014).

sql server management studio 2014 reports column type correctly (datetime), regardless of version of server connected to.

what's wrong jdbc driver? has microsoft once again broken compatibility 1 of own products?

"has microsoft once again broken compatibility 1 of own products?"

technically, no, because current versions of jdbc driver not support sql server 2005. according sql server requirements jdbc driver:

for microsoft jdbc driver 4.2 , 4.1 sql server, support begins sql server 2008. microsoft jdbc driver 4.0 sql server, support beings [sic] sql server 2005.

this discussed on github.


Comments

Popular posts from this blog

javascript - Create a stacked percentage column -

Optimising Firebase database by automatically overwriting data -

javascript - Angular UI-Grid customTemplate directive causing rows to load slowly/? -