Search code examples
javasql-serverjdbcjtds

MSSQL - Invalid column name with Java/JTDS


I have read all the threads about my problem and all of them finish without solution... Anyway I hope to be luckier...

I'm trying to use JDBC to connect to the MSSQL db. I used the driver from Microsoft sqljdbc4.jar and I had no problem. Since I have to switch to JTDS (I'm using 1.2.8) I got this exception when I try to run the same SQL string:

java.sql.SQLException: Invalid column name 'id'.    at
net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2894)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2334)   at
net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:643)  at
net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:506)
    at
net.sourceforge.jtds.jdbc.JtdsStatement.executeQuery(JtdsStatement.java:1433)

The string is

SELECT tabledatastoreitem.name, tabledatastoreitem.path
FROM tabledatastoreitem, store, service, serviceprovider
WHERE tabledatastoreitem.store_id = store.id
    AND store.service_store_id = service.id
    AND service.serviceprovider_id = serviceprovider.id
    AND serviceprovider.name = 'SystemIService'
    AND store.createdttm < CONVERT(varchar(100), DATEADD(MI, -7, GETDATE()));

Any idea?


Solution

  • From what I can see in your statement, there are 3 possibilities.

    store.id
    service.id
    serviceprovider.id
    

    Debug this by removing portions of the statement, or executing it in the command line, until you figure out which reference to .id is causing you issue. I would highly suggest using naming such as

    store.store_id
    service.service_id
    serviceprovider.serviceprovider_id
    

    It makes debugging and readability a lot easier for you in the future.

    Edit:

    Try using the following statement. It does the same as yours (from what I can tell), but uses JOINS instead of CROSSES. It could make your debugging a bit easier.

    SELECT tabledatastoreitem.name, tabledatastoreitem.path
    FROM tabledatastoreitem
    JOIN store ON store.id=tabledatastoreitem.store_id
    JOIN service ON service.id = store.service_store_id
    JOIN serviceprovider ON service.serviceprovider_id = serviceprovider.id
    WHERE serviceprovider.name = 'SystemIService'
      AND store.createdttm < CONVERT(varchar(100), DATEADD(MI, -7, GETDATE()));