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的主要内容,如果未能解决你的问题,请参考以下文章