Java Microsoft JDBC子句中的准备语句

Java Microsoft JDBC子句中的准备语句,jdbc,prepared-statement,Jdbc,Prepared Statement,我在这里和其他地方都看到过这样做的例子。 在in子句中使用“1”参数时,我已成功: SELECT AVG( ( High_Temperature + Low_Temperature ) / 2.0 ) FROM obs_masterAll WHERE Observation_Valid_Time = ? AND Location_ID IN ( ? ); Microsoft JDBC Driver 4.2 for SQL Server 4.2.6420.100

我在这里和其他地方都看到过这样做的例子。
在in子句中使用“1”参数时,我已成功:

SELECT AVG( ( High_Temperature + Low_Temperature ) / 2.0 ) 
  FROM obs_masterAll 
  WHERE Observation_Valid_Time = ? AND 
        Location_ID IN ( ? );

Microsoft JDBC Driver 4.2 for SQL Server  4.2.6420.100
Parameter Count = 2
2010, 36.5
但是,由于in子句中有多个参数,我得到以下结果:

SELECT AVG( ( High_Temperature + Low_Temperature ) / 2.0 ) 
  FROM obs_masterAll 
  WHERE Observation_Valid_Time = ? 
  AND Location_ID IN ( ?, ? );      <--- PROBLEM HERE

Microsoft JDBC Driver 4.2 for SQL Server  4.2.6420.100
Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near ','.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191)
    at com.microsoft.sqlserver.jdbc.SQLServerParameterMetaData.<init>(SQLServerParameterMetaData.java:423)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getParameterMetaData(SQLServerPreparedStatement.java:1659)
    at CreateAMultiStationDailyLoadCtrAvgHistogram.main(CreateAMultiStationDailyLoadCtrAvgHistogram.java:68)
Java Result: 1
选择平均值((高温+低温)/2.0)
来自obs_masterAll
其中观察值有效时间=?

以及在(?,)中的位置标识 我认为这是您使用的JDBC驱动程序版本中的一个问题

我可以使用与您相同版本的SQL Server JDBC驱动程序重现此问题。我无法在MySQL和Oracle上运行相同的查询来重现这个问题。我必须删除查询末尾的分号,才能让它在Oracle上运行,但同样的更改并不能解决SQL Server的问题


如果改用(版本6.0.6629.101),我也无法重现这个问题。

上面关于JDBC驱动程序的回答让我很接近。我使用的是一个非常旧的Microsoft JDBC驱动程序,所以升级肯定有帮助。我现在使用的是微软JDBC驱动程序6.0版的社区技术预览版(6.0.6629.101版),而不是上面推荐的版本

但是,我还是遇到了问题

当我从代码中删除以下行时:

ParameterMetaData pmData = prepStmt.getParameterMetaData();
System.out.println( "Parameter Count = " + pmData.getParameterCount() );
一切正常

我不确定为什么“ParameterMetaData”数据类型不起作用,但当从代码中删除时,它肯定解决了我的问题


修正

您没有正确地将值分配给占位符。您在forst for循环中编写了i非常感谢您的快速响应!我认为问题在于SQL语法(根据上面堆栈跟踪的第一行)。代码在创建ParameterMetaData对象时出错,甚至无法分配参数。Luke->你太棒了!特别是在MySql和Oracle上进行测试。我认为这是一个驱动程序问题,但我认为在得出结论之前,代码审查是合适的。我一定会尝试预览版6.0,然后回来报告@用户3225536:谢谢!我已经安装了MySQL和Oracle数据库,所以检查这些数据库不需要太多额外的工作。问题中的代码与
ParameterMetaData
关系不大,因此可以通过不获取参数元数据来避免错误。但是,我怀疑上面的代码是从实际代码中提取的,实际代码确实需要使用
参数metadata
。这是否正确?Luke-->ParameterMetaData仅用于调试。这最初是在尝试“设置”参数时出现的。它抱怨没有足够的资金。我把它扔进去看看有多少。故事的其余部分如上所述。再一次,我非常感谢你看这个。第二双眼睛和代码检查总是一件好事。非常感谢!
ParameterMetaData pmData = prepStmt.getParameterMetaData();
System.out.println( "Parameter Count = " + pmData.getParameterCount() );