繁体   English   中英

MSSQL-Java / JTDS的无效列名

[英]MSSQL - Invalid column name with Java/JTDS

我已经阅读了有关我的问题的所有主题,并且所有主题都没有解决方案...无论如何,我希望自己能更幸运...

我正在尝试使用JDBC连接到MSSQL数据库。 我使用了来自Microsoft sqljdbc4.jar的驱动程序,没有问题。 由于必须切换到JTDS(我使用的是1.2.8),因此当我尝试运行相同的SQL字符串时遇到了此异常:

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)

字符串是

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()));

任何想法?

从您的发言中可以看出,有3种可能性。

store.id
service.id
serviceprovider.id

通过删除语句的某些部分或在命令行中执行它来调试它,直到找出导致问题的对.id引用。 我强烈建议您使用诸如

store.store_id
service.service_id
serviceprovider.serviceprovider_id

将来,它使调试和可读性变得更加容易。

编辑:

尝试使用以下语句。 它的功能与您的相同(据我所知),但是使用JOINS而不是CROSSES 它可以使您的调试容易一些。

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()));

我不确定如何发生,但是您可以尝试在代码中转义所有'id'实例,以查看是否可以解决此问题:

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()));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM