繁体   English   中英

准备语句中的绑定不适用于Microsoft SQL Server JDBC驱动程序sqljdbc4.jar

[英]Binding in Prepared Statement is not working with Microsoft SQL Server JDBC Driver sqljdbc4.jar

我在类路径中使用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方法)并再次执行程序,这次我得到了结果。

有人可以帮我解决这个问题。

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

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

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

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

后者可能不正确。 我在使用PreparedStatement获取估计的查询计划时遇到了麻烦。 因此,它可能不适用于您的问题。

另外,您可能想访问结果集中的一列,而不是toString()会给您带来什么:使用rs.getString(1)来获取第一个结果集的列值(假设它是String)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM