Привязка в подготовленном операторе не работает с драйвером JDBC Microsoft SQL Server sqljdbc4.jar - PullRequest
0 голосов
/ 23 декабря 2011

Я запустил следующую программу с 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, ГДЕ EMPNAME похож на 'DEMO'"(Метод setString здесь не используется) и снова запустил программу, на этот раз я получил результаты.

Может кто-нибудь выручить меня из этой проблемы.

Ответы [ 2 ]

0 голосов
/ 01 августа 2016

Какой тип столбца «EMPNAME»?Это varchar или что-то в этом роде?Используйте метод setXXX (), похожий на тип столбца.Так что если тип столбца IS типа String или Text, тогда setString () должен работать.Если это тип varchar или nvarchar и т. Д., Вы также можете использовать команду

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

.Просто убедитесь, что SQLType доступен в соответствии с версией Java, с которой вы компилируете.java.sql.Types.NVARCHAR недоступен до Java 1.6.Кроме того, возможно ли, что заполнитель вашего параметра (?) Должен быть в одинарных кавычках?То есть.

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

Последнее может быть неверным.Я столкнулся с этим в моей борьбе с получением оценочного плана запроса, используя PreparedStatement.Так что это может не относиться к вашей проблеме здесь.

0 голосов
/ 23 декабря 2011

Кроме того, вы можете захотеть получить доступ к столбцу в наборе результатов, а не к тому, что вам даст toString(): используйте rs.getString(1), чтобы получить значение столбца первого набора результатов (при условии, что это строка).

Подсказка: не используйте звездочки в запросах.Более стабильно использовать конкретные имена столбцов.В противном случае изменения в вашей базе данных могут вернуть столбцы в другом порядке, и ваш код будет поврежден.

...