2012-01-05 8 views
0

У меня есть файл dbf, и я должен обновить базу данных sybase. Я поместил все записи из файла dbf в сингл-карту, первым аргументом на карте которой является значение, которое должно быть установлено в банке данных, а второе - это условие, в данном случае Memo. Как я могу обновить базу данных sybase?Обновление базы данных sybase за один раз?

public static void updateBcHeader(Map<String,String> list){ 
    String query = "update BcHeader\n" + 
      "set Label='poika' \n" + 
      "where Memo like 'A'"; 


} 

ответ

-1

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

 PreparedStatement stmt; 
    try { 
     stmt = con.prepareStatement("update BcHeader set Label = ? where memo like ?"); 
     for (Map.Entry<String, String> entry : list.entrySet()) { 
     stmt.setString(1, entry.getKey()); 
     stmt.setTimestamp(2, new Timestamp(new Date().getTime()), Calendar.getInstance()); 
     stmt.setString(3, entry.getValue()); 
     stmt.executeUpdate(); 
    } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
+2

Вы не должны игнорировать SQLException. И утверждение должно быть закрыто в блоке finally. И этот код не может работать. Вы связываете 3 параметра, и запрос имеет только 2. И использование подобного в Timestamp не имеет смысла. Если вы ответите на свой собственный вопрос и примите свой ответ, сделайте его как минимум правильным. –

3

Петля над элементами карты и выполнить оператор обновления для каждой записи:

PreparedStatement stmt = 
    connection.prepareQuery("update BcHeader set Label = ? where Memo like ?"); 
for (Map.Entry<String, String> entrySet : list.entries()) { 
    stmt.setString(1, entry.getKey()); 
    stmt.setString(2, entry.getValue()); 
    stmt.executeUpdate(); 
} 

Обратите внимание, что карта действительно плохой выбор для хранения этих аргументов. Что делать, если у вас было несколько значений для установки или несколько элементов в предложении where? Что, если несколько памяток имеют один и тот же ярлык? Вы должны использовать List<Change>, где Change будет объектом, имеющим поля label и memo.

+0

Просто небольшая коррекция: 'PreparedStatement STMT; \t try { \t \t stmt = con.prepareStatement ("update BcHeader set Label =? Where memo like?"); \t \t for (Map.Entry entry: list.entrySet()) { \t \t stmt.setString (1, entry.getKey()); \t \t \t stmt.setTimestamp (2, новая метка времени (новая дата(). GetTime()), Calendar.getInstance()); \t \t stmt.setString (3, entry.getValue()); \t \t stmt.executeUpdate(); \t} \t} catch (SQLException e) { \t \t e.printStackTrace(); \t} ' – itro

+0

Я оставил обработку исключений как упражнение для читателя. Игнорирование исключений, как вы предлагаете, - плохая идея. –

Смежные вопросы