1 Востаннє редагувалося Lujok (13.09.2015 19:49:30)

Тема: після додавання колонки в БД SQLIte проблема з оновленям таблиці jtabl

Колонка  успішно добавляеться в базу даних  SQLIte . Але таблиця jtablе оновлюеться не вірно. Замість нової колонки добавляеться ще одна з тих що вже є.
частина коду:

PreparedStatement prstm =null;
String strInput = "Ведіть назву колонки ";
String strInputSql =  JOptionPane.showInputDialog(strInput);
String strInputSqlTYPE =  JOptionPane.showInputDialog("Ведіть тип даних?");

String AddColumn = "Alter Table testTable  ADD  '"+strInputSql +"'  '"+strInputSqlTYPE +"' " ;
prstm = conn.prepareStatement(AddColumn);
prstm.executeUpdate();
data.clear();     //   в data зберігаються дані таблиці (jTable)
getTableContents(tableName);// метoд заповнює даними таблицю (jTable)
fireTableStructureChanged();
if (prstm!=null ) prstm.close();

ось скрін :
http://savepic.ru/7736552m.gif

2 Востаннє редагувалося fed_lviv (13.09.2015 17:20:17)

Re: після додавання колонки в БД SQLIte проблема з оновленям таблиці jtabl

Lujok написав:

...
getTableContents(tableName);// метoд заповнює даними таблицю (jTable)
...

Ось тут детальніше можна?

Lujok написав:

...
data.clear();     //   в data зберігаються дані таблиці (jTable)
...

А назви колонок, якщо не секрет, де зберігаються?!

3 Востаннє редагувалося Lujok (13.09.2015 19:56:23)

Re: після додавання колонки в БД SQLIte проблема з оновленям таблиці jtabl

fed_lviv написав:

...
getTableContents(tableName);// метoд заповнює даними таблицю (jTable)
...
Ось тут детальніше можна?


в методі визначається кількість колонок в таблиці БД та їх типи і заповнюється даними

private ArrayList<Object[]> data;

public void getTableContents(String tableName)
        throws SQLException {

    meta = conn.getMetaData();

    rs = meta.getColumns(null, null, tableName, null);// отримати метадані по колонкам

    // ArrayList colNamesList = new ArrayList();// список імен колонок
    ArrayList colTypesList = new ArrayList();// список типів колонок

    // цикл по всім колонкам таблиці
    // для кожної колонки визначити імя і тип 
    while (rs.next()) {

        colNamesList.add(rs.getString("COLUMN_NAME"));// добавити в список імя колонок

        int dbType = rs.getInt("DATA_TYPE");// визначити тип колонки

        // вибрати потрібний тип
        switch (dbType) {
            case Types.INTEGER:
                colTypesList.add(Integer.class);
                break;
            case Types.FLOAT:
                colTypesList.add(Float.class);
                break;
            //case Types.DOUBLE:
            case Types.REAL:
                colTypesList.add(Double.class);
                break;
            case Types.DATE:
            case Types.TIME:
            case Types.TIMESTAMP:
                colTypesList.add(java.sql.Date.class);
                break;
            default:
                colTypesList.add(String.class);
                break;
        };

    }

    // імена колонок зберегти в окремий масив columnNames
    columnNames = new String[colNamesList.size()];
    colNamesList.toArray(columnNames);
    
    for(int n=0; n<columnNames.length; n++){
        System.out.println("імена колонок (getTableContents)--"+columnNames[n]);
    }

    // типи колонок зберегти в окремий масив  columnClasses
    columnClasses = new Class[colTypesList.size()];
    colTypesList.toArray(columnClasses);

    Statement statement = conn.createStatement();
    rs = statement.executeQuery("SELECT * FROM " + tableName);

    ArrayList rowList = new ArrayList(); // зберігає записи із таблиці

    // цикл по всим записам таблиці
    while (rs.next()) {
        ArrayList cellList = new ArrayList();// зберігає дані по кожній колонці (ячейці)

        for (int n = 0; n< columnClasses.length; n++) {
            Object cellValue = null;

            if (columnClasses[n] == String.class) {
                cellValue = rs.getString(columnNames[n]);
            } else if (columnClasses[n] == Integer.class) {
                cellValue = new Integer(rs.getInt(columnNames[n]));
            } else if (columnClasses[n] == Float.class) {
                cellValue = new Float(rs.getInt(columnNames[n]));
            } else if (columnClasses[n] == Double.class) {
                cellValue = new Double(rs.getDouble(columnNames[n]));
            } else if (columnClasses[n] == java.sql.Date.class) {
                cellValue = rs.getDate(columnNames[n]);
            } else {
                System.out.println("Не можу визначити тип поля " + columnNames[n]);
            }
            cellList.add(cellValue);
        }// for

        Object[] cells = cellList.toArray();
        data.add(cells);
    } // while

    if (rs!=null ) rs.close();
    if (statement!=null ) statement.close();
      System.out.println(" method getTableContents(tableName);");
}

4 Востаннє редагувалося Lujok (13.09.2015 19:51:40)

Re: після додавання колонки в БД SQLIte проблема з оновленям таблиці jtabl

fed_lviv написав:

А назви колонок, якщо не секрет, де зберігаються?!

private ArrayList colNamesList = new ArrayList();// список імен колонок

запювнюється в getTableContents() ,  та  зберігаються в одномірному масиві
columnNames = new String[colNamesList.size()];
        colNamesList.toArray(columnNames);


    @Override
    public String getColumnName(int columnIndex ) {
        return columnNames[columnIndex];         
    }

5

Re: після додавання колонки в БД SQLIte проблема з оновленям таблиці jtabl

Тобто, Ви кожен раз при зміні даних в таблиці створюєте, новий об'єкт ArrayList colNamesList чи, я щось не догледів?
З першого повідомлення, я бачу, як Ви очищуєте масив з даними в таблиці (data.clear();), чому ж Ви не хочете сторити колекції (назва стовбців та тип стовбців) та так само їх очищувати, а потім наповнювати даними при запиті до БД і буде Вам щастя. Я ж Вам приклад по моделі таблиці писав у іншій темі чим він Вам не підійшов? http://replace.org.ua/topic/5261/

Подякували: Lujok1

6 Востаннє редагувалося fed_lviv (14.09.2015 10:42:23)

Re: після додавання колонки в БД SQLIte проблема з оновленям таблиці jtabl

Чому саме так?

....
meta = conn.getMetaData();
rs = meta.getColumns(null, null, tableName, null);// отримати метадані по колонкам
...

А не краще взяти назви і тип колонок з результату запиту до БД:

...
ResultSet result;
...
result.getMetaData().getColumnName(int x);
result.getMetaData().getColumnClassName(int x);
...
Подякували: Lujok1

7

Re: після додавання колонки в БД SQLIte проблема з оновленям таблиці jtabl

fed_lviv написав:

Чому саме так?

....
meta = conn.getMetaData();
rs = meta.getColumns(null, null, tableName, null);// отримати метадані по колонкам
...

А не краще взяти назви і тип колонок з результату запиту до БД:

...
ResultSet result;
...
result.getMetaData().getColumnName(int x);
result.getMetaData().getColumnClassName(int x);
...

А чим краще Ваш спосіб . Яка взагалі різниця.

8

Re: після додавання колонки в БД SQLIte проблема з оновленям таблиці jtabl

Чим кращий? Скажімо, так, і перший і другий варіант будуть працювати. Інша справа, що так, на мою думку, компактніший код вийде.

Подякували: Lujok1