Prepared Statement 中的绑定不适用于 Microsoft SQL Server JDBC 驱动程序 sqljdbc4.jar

Posted

技术标签:

【中文标题】Prepared Statement 中的绑定不适用于 Microsoft SQL Server JDBC 驱动程序 sqljdbc4.jar【英文标题】:Binding in Prepared Statement is not working with Microsoft SQL Server JDBC Driver sqljdbc4.jar 【发布时间】:2011-12-23 11:56:49 【问题描述】:

我在类路径中使用 sqljdbc4.jar 运行了以下程序。 EMPLOYEE 表中有员工姓名 DEMO 的数据,但以下程序未检索 DEMO 的数据。当同一个程序在类路径中使用 Merlia.jar 运行时,它正在为 DEMO 检索数据。

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");      
Connection con = DriverManager.getConnection("jdbc:sqlserver://SERVER23:5000;databaseName=TESTDB", "SYSADM", "SYSADM");

String sqlSele = "SELECT * FROM EMPLOYEE WHERE EMPNAME like ?" ;
PreparedStatement sts = con.prepareStatement(sqlSele);
sts.setString(1, "DEMO" );      
ResultSet rs = sts.executeQuery();
while(rs.next())

System.out.println("driverConn.main()" + rs.toString());



catch(Exception e)
        
System.out.println(e);
e.printStackTrace();
        

修改sql语句为“SELECT * FROM EMPLOYEE WHERE EMPNAME like 'DEMO'”(这里没有使用setString方法)再次执行程序,这次得到结果了。 p>

谁能帮我解决这个问题。

【问题讨论】:

【参考方案1】:

此外,您可能希望访问结果集中的列,而不是 toString() 提供的任何内容:使用 rs.getString(1) 获取第一个结果集列值(假设它是一个字符串)。

提示:不要在查询中使用星号。使用具体的列名更稳定。否则,对数据库的更改可能会以不同的顺序返回列,并且您的代码会中断。

【讨论】:

您在使用sqljdbc4.jar时遇到过这些类型的问题吗?相同的程序在 Merlia.jar 上运行良好。 我在 system.out.print 语句中使用了 rs.getString(1),但即便如此,控制台上也没有观察到输出。 问题可能出在 setString() 方法上,因为当我使用 SQL 语句作为“SELECT * FROM EMPLOYEE WHERE EMPNAME like 'DEMO'”(不使用 setString 进行绑定)时,我在控制台。【参考方案2】:

“EMPNAME”的列类型是什么?是varchar还是类似的东西? 使用类似于列类型的 setXXX() 方法。因此,如果列类型为 String 或 Text 类型,则 setString() 应该可以工作。 如果是varchar或nvarchar等类型也可以使用

sts.setObject(1, 'DEMO', java.sql.Types.$AppropriateTypeHere);

命令。只需根据您正在编译的 Java 版本确认 SQLType 是否可用。 java.sql.Types.NVARCHAR 在 Java 1.6 之前不可用。 此外,是否可能要求您的参数占位符(?)需要用单引号引起来? IE。

String sql = "SELECT * FROM EMPLOYEE WHERE EMPNAME like '?'" ;

后者可能不正确。我在使用 PreparedStatement 获得估计查询计划的斗争中遇到了它。所以它可能不适用于您的问题。

【讨论】:

以上是关于Prepared Statement 中的绑定不适用于 Microsoft SQL Server JDBC 驱动程序 sqljdbc4.jar的主要内容,如果未能解决你的问题,请参考以下文章

MYSQLI Prepared statement update statement with where in array

启用 SQL 触发器时,Java 中的 Prepared Statement 失败

PDO Prepared Statement 允许执行 javascript

如何从 SQL 中的视图中选择? (一般错误:1615 Prepared statement需要重新准备)

在executeBatch()之前如何检查Prepared Statement是不是有一些批次?

Prepared SQL Statement Syntax