【问题标题】:MSSQL - Invalid column name with Java/JTDSMSSQL - Java/JTDS 的列名无效
【发布时间】:2014-06-24 15:26:18
【问题描述】:

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

我正在尝试使用 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()));

有什么想法吗?

【问题讨论】:

  • 对您阅读过的任何早期线程的任何引用?
  • 你能从你的表中添加相关的create语句吗?
  • 您的 store/service/serviceprovider 表是否有 id 字段?
  • 您要获取 分钟 之前创建的项目?
  • 是的,如果我使用 MSSQL 驱动程序,并且如果我在 DBVisualizer 中运行它,那么 SQL 字符串可以正常工作。当我使用 JDTS 驱动程序时会出现问题。

标签: java sql-server jdbc jtds


【解决方案1】:

从您的陈述中我可以看出,有 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()));

【讨论】:

  • 谢谢迈克。我试图减少字符串,但第一个 store.id 遇到了同样的问题。
  • 你能用模式更新你的问题吗?通常,当列不存在时,会给出无效的列名。
  • 标记当我使用微软的驱动程序运行相同的字符串时它工作正常,当我从 dbVisualizer 运行它时也是如此
  • 我已经更新了我的答案以包含一个使用连接而不是交叉的语句,你能尝试执行它并让我知道会发生什么吗?
  • 谢谢 Mike,但没什么,反正你的 sql 与 join 工作得很好
【解决方案2】:

我不确定这是怎么发生的,但您可以尝试转义代码中的所有 '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()));

【讨论】:

  • 谢谢阿尔文,但什么都没有...... :(
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多