Проблемы со вставкой строковых параметров в подготовленный оператор - PullRequest
1 голос
/ 19 февраля 2010

У меня есть база данных, работающая на MS SQL Server.Мое приложение связывается с ним через JDBC и ODBC.Теперь я пытаюсь использовать подготовленные операторы.

Когда я вставляю числовой (длинный) параметр, все работает нормально.Когда я вставляю строковый параметр, он не работает.Там нет сообщения об ошибке, но пустой набор результатов.

WHERE column LIKE ('%' + ? + '%') --inserted "test" -> empty result set
WHERE column LIKE ? --inserted "%test%" -> empty result set
WHERE column = ? --inserted "test" -> works

Но мне нужна функциональность LIKE.Когда я вставляю эту же строку непосредственно в строку запроса (не как подготовленный параметр оператора), она работает нормально.

WHERE column LIKE '%test%'

Это выглядит для меня как двойные кавычки, но я никогда не использовал кавычки внутристрока.Я использую подготовленный.Statement.setString (int index, String x) для вставки.

Что вызывает эту проблему?Как я могу это исправить?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2010

Я использую JDbcOdbcBridge от SUN. Насколько я читал, вы должны избегать его использования. Может быть, есть лучшая реализация там.

Пока я написал метод фоллинга. Он вставляет параметры строкового типа в оператор с помощью строковых операций перед тем, как оператор компилируется Вы должны построить карту параметров с индексом параметра в качестве ключа и значением в качестве самого параметра.

private static String insertStringParameters(String statement, Map<Integer, Object> parameters) {
    for (Integer parameterIndex : parameters.keySet()) {
        Object parameter = parameters.get(parameterIndex);
        if (parameter instanceof String) {
            String parameterString = "'" + (String) parameter + "'";
            int occurence = 0;
            int stringIndex = 0;
            while(occurence < parameterIndex){
                stringIndex = statement.indexOf("?", stringIndex) + 1;
                occurence++;
            }
            statement = statement.substring(0, stringIndex - 1) + parameterString + statement.substring(stringIndex);
        }
    }
    return statement;
}
0 голосов
/ 19 февраля 2010

Что вы вставляете в '?'

Если вы вставляете

test

, тогда это приведет к

WHERE column LIKE ('%' + test + '%')

, что приведет к ошибке.Если вы вставляете

"test"

, то это приведет к

WHERE column LIKE ('%' + "test" + '%')

, что приведет к ошибке.Вам нужно вставить

'test'

Тогда это приведет к

WHERE column LIKE ('%' + 'test' + '%')

И это должно сработать.

Я не знаю, почему = "test" работает,это не должно происходить, если у вас нет столбца с именем test.

...