Вставьте переменную Java использование Java в SQL

Я пытался сделать:

 String sql = "INSERT INTO CURRENT_WEATHER_US VALUES("+city_code+",   
"+object.city+","+object.region+","+object.country+","+object.wind_chill+",  
"+object.wind_direction+", "+object.wind_speed+","+object.humidity+","+object.visibility+", 
"+object.pressure+","+object.rising+",  
"+object.sunrise+","+object.sunset+","+object.textual_description+",  
"+object.condition_code+","+object.temp+","+object.for_temp_high+",  
"+object.for_temp_low+","+object.for_description+","+object.forecast_code+")";   

  stmt.execute(sql);  

Ошибка пропускает запятую

Помогите

5
задан BalusC 13 February 2010 в 04:52
поделиться

3 ответа

На самом деле это не тот способ, которым вы должны создавать и выполнять SQL ВСТАВИТЬ запрос с переменными. Это не только подвержено атакам с использованием SQL-инъекций , но также довольно .. громоздко;) Возможно, значение содержало одинарную кавычку, что сделало ваш запрос синтаксически недействительным.

Просто не объединяйте переменные в строку SQL. Вместо этого используйте PreparedStatement ( учебное пособие здесь ) в сочетании с ? в качестве заполнителя для переменной в строке SQL. Таким образом, вы можете красиво поместить полноценные объекты Java (включая Date и InputStream !) В оператор SQL по индексу значения, не беспокоясь о символах в строках, которые могут синтаксически нарушить SQL-запрос (и таким образом также вызывают риски внедрения SQL-кода).

Вот начальный пример, основанный на вашем исходном SQL-запросе:

private static final String SQL_INSERT = "INSERT INTO CURRENT_WEATHER_US"
    + " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

public void create(String cityCode, Weather weather) throws SQLException {
    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_INSERT);
    ) {
        statement.setString(1, cityCode);
        statement.setString(2, weather.getCity());
        statement.setString(3, weather.getRegion());
        // ...
        statement.setString(20, weather.getForecastCode());
        statement.executeUpdate();
    }
}

Чтобы узнать больше о правильном использовании базового JDBC , вы можете найти эту статью полезной.

Надеюсь, это поможет.

27
ответ дан 18 December 2019 в 05:43
поделиться

Это уникальный идентификатор класса, используемый для сериализации.

Если сериализация выполняется как можно скорее, то при изменении класса будет автоматически создан другой класс, и сериализация перестанет работать.

Хорошая ссылка здесь: http://c2.com/ppr/wiki/JavaIdioms/AlwaysDeclareSerialVersionUid.html

-121--1212840-

У меня была та же проблема. Я знаю, что тема старая, но, возможно, мое решение поможет кому-то еще... Необходимо просто переместить модальное определение в метод:

// ModalViewController initialization
- (void) presentStartUpModal 
{
    ModalStartupViewController *startUpModal = [[ModalStartupViewController alloc] initWithNibName:@"StartUpModalView" bundle:nil];
    startUpModal.delegate = self;

    [self presentModalViewController:startUpModal animated:YES];
    [startUpModal release]; 
}

Далее в viewDidLoad вызовите метод модального определения в performSelector: wireObject: afterDelay: с 0 в качестве значения задержки. Вот так:

- (void)viewDidLoad
{
    [super viewDidLoad];
    //[self presentStartUpModal];  // <== This line don't seems to work but the next one is fine.
    [self performSelector:@selector(presentStartUpModal) withObject:nil afterDelay:0.0];
}

Я до сих пор не понимаю, почему «стандартный» способ не работает.

-121--4692013-

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

Если в запросе textual_description и for_description только столбцы последовательность, то запрос должен выглядеть следующим образом:

String sql = "INSERT INTO CURRENT_WEATHER_US VALUES( " +
    city_code + ", " +
    object.city + ", " +
    object.region + ", " +
    object.country + ", " +
    object.wind_chill  + ", " +
    object.wind_direction + ", " +
    object.wind_speed + ", " +
    object.humidity + ", " +
    object.visibility + ", " +
    object.pressure + ", " +
    object.rising + ", " +
    object.sunrise + ", " +
    object.sunset + ", " +
    "'" + object.textual_description + "', " +
    object.condition_code + ", " +
    object.temp + ", " +
    object.for_temp_high + ", " +
    object.for_temp_low + ", " +
    "'" + object.for_description + "', " +
    object.forecast_code + 
    " )";   

stmt.execute(sql);  

Обратите внимание на отдельные кавычки, окружающие эти значения.

0
ответ дан 18 December 2019 в 05:43
поделиться

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

3
ответ дан 18 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: