准备语句 IN 子句 Java Microsoft JDBC
Prepared Statements IN Clause Java Microsoft JDBC
我在这里和其他地方看到的例子表明这应该有效。
在 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 CLAUSE 中有多个参数,我得到这个:
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
这是我的代码:
prepStmt = buildPreparedStatement( conn.getConnectionObject() ); //function below
conn.printDriverInfo();
sqlDate = new java.sql.Date( beginDate.getTimeInMillis() );
ParameterMetaData pmData = prepStmt.getParameterMetaData();
System.out.println( "Parameter Count = " + pmData.getParameterCount() );
prepStmt.setDate( 1, sqlDate );
for( i = 0; i < locID.size(); i++ )
{
prepStmt.setString( ( i + 2 ), locID.get(i) );
}
rslt = prepStmt.executeQuery();
private PreparedStatement buildPreparedStatement(java.sql.Connection con)
throws SQLException
{
int i;
StringBuilder sb = new StringBuilder();
sb.append("SELECT AVG( ( High_Temperature + Low_Temperature ) / 2.0 ) ");
sb.append("FROM obs_masterAll ");
sb.append("WHERE Observation_Valid_Time = ? AND " );
sb.append("Location_ID IN ( " );
for( i = 0; i < ( locID.size() - 1 ); i++ )
{
sb.append( "?" ).append(", ");
}
sb.append( "?" ).append(" );");
System.out.println( sb.toString() );
return( con.prepareStatement( sb.toString() ) );
}
是我的代码有问题,还是 JDBC 驱动程序有问题?
我会说这是您使用的 JDBC 驱动程序版本的问题。
我可以使用与您相同版本的 SQL 服务器 JDBC 驱动程序重现此问题。我无法重现此问题 运行 对 MySQL 或 Oracle 使用相同的查询。我必须删除查询末尾的分号才能将其发送到 运行 针对 Oracle,但同样的更改并不能解决 SQL 服务器的问题。
如果我改用 community technology preview edition of version 6.0 of the Microsoft JDBC driver(版本 6.0.6629.101),我也无法重现问题。
上面关于 JDBC 驱动程序的回复让我很接近。我使用的是非常旧的 Microsoft JDBC 驱动程序,因此升级肯定有帮助。我现在正在使用 Microsoft JDBC 驱动程序(版本 6.0.6629.101)6.0 版的社区技术预览版,而不是上面推荐的。
不过,我还是运行遇到了问题。
当我从代码中删除以下行时:
ParameterMetaData pmData = prepStmt.getParameterMetaData();
System.out.println( "Parameter Count = " + pmData.getParameterCount() );
一切正常!
我不确定为什么 'ParameterMetaData' 数据类型不起作用,但是从代码中删除后,它确实解决了我的问题。
已修复!
我在这里和其他地方看到的例子表明这应该有效。
在 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 CLAUSE 中有多个参数,我得到这个:
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
这是我的代码:
prepStmt = buildPreparedStatement( conn.getConnectionObject() ); //function below
conn.printDriverInfo();
sqlDate = new java.sql.Date( beginDate.getTimeInMillis() );
ParameterMetaData pmData = prepStmt.getParameterMetaData();
System.out.println( "Parameter Count = " + pmData.getParameterCount() );
prepStmt.setDate( 1, sqlDate );
for( i = 0; i < locID.size(); i++ )
{
prepStmt.setString( ( i + 2 ), locID.get(i) );
}
rslt = prepStmt.executeQuery();
private PreparedStatement buildPreparedStatement(java.sql.Connection con)
throws SQLException
{
int i;
StringBuilder sb = new StringBuilder();
sb.append("SELECT AVG( ( High_Temperature + Low_Temperature ) / 2.0 ) ");
sb.append("FROM obs_masterAll ");
sb.append("WHERE Observation_Valid_Time = ? AND " );
sb.append("Location_ID IN ( " );
for( i = 0; i < ( locID.size() - 1 ); i++ )
{
sb.append( "?" ).append(", ");
}
sb.append( "?" ).append(" );");
System.out.println( sb.toString() );
return( con.prepareStatement( sb.toString() ) );
}
是我的代码有问题,还是 JDBC 驱动程序有问题?
我会说这是您使用的 JDBC 驱动程序版本的问题。
我可以使用与您相同版本的 SQL 服务器 JDBC 驱动程序重现此问题。我无法重现此问题 运行 对 MySQL 或 Oracle 使用相同的查询。我必须删除查询末尾的分号才能将其发送到 运行 针对 Oracle,但同样的更改并不能解决 SQL 服务器的问题。
如果我改用 community technology preview edition of version 6.0 of the Microsoft JDBC driver(版本 6.0.6629.101),我也无法重现问题。
上面关于 JDBC 驱动程序的回复让我很接近。我使用的是非常旧的 Microsoft JDBC 驱动程序,因此升级肯定有帮助。我现在正在使用 Microsoft JDBC 驱动程序(版本 6.0.6629.101)6.0 版的社区技术预览版,而不是上面推荐的。
不过,我还是运行遇到了问题。
当我从代码中删除以下行时:
ParameterMetaData pmData = prepStmt.getParameterMetaData();
System.out.println( "Parameter Count = " + pmData.getParameterCount() );
一切正常!
我不确定为什么 'ParameterMetaData' 数据类型不起作用,但是从代码中删除后,它确实解决了我的问题。
已修复!