Zum Inhalt springen

Vector oder Hashtable fuer Datenbankabfrage?


Empfohlene Beiträge

Geschrieben

Hi,

ich habe eine abfrage:

select id, text from tabelle order by text;

den text moechte ich in einer JComboBox darstellen, die ID im 'hinterkopf' behalten, um spaeter insert statements zu erstellen.

wenn ich nun nen 2 Dimensionalen Vector verwende, wird mir der text und die id mit klammern '[]' ausgegeben, d.h. z.b. [TEXT] ... wenn ich allerdings nen hashtable verwende (id als key, text als value) komm ich nicht mehr richtig an den key ran. desweiteren sind sortiermethoden etc. recht schwierig.

hat jemand ne bessere moeglichkeit??

danke. :)

Geschrieben

hajo

aber da wo das das select machst weiß du ja wie groß das array sein muss.

kannst ja vorher ein select count(*) machen oder so

un dann halt das array erzeugen mit [spalten die sin ja eh fest also 2][Zeilen das count von oben]

^^so funzt es

Geschrieben

Also,

ich würde eine eigene Klasse Datensatz schreiben, mit einem int und einem String.

Bei dieser Klasse überschreibst du dann die toString() Methode, sodaß in der JComboBox das richtige angezeigt wird.

Nun kannst du deine Rows aus dem ResultSet in diesen Objekttyp umwandeln und in einen Vector oder ein Array packen und somit der JComboBox übergeben.

Gruß Jaraz

PS: Noch besser wäre ein eigenes ComboBoxModel, aber das willst du ja nicht.

Geschrieben

Wie wär´s denn mit einer ArrayList (evtl. einer Arraylist von ArrayLists)?

Die sind dynamisch in der Größe änderbar und haben noch andere div. Vorteile. Also ich nutze die am liebsten.:D

Peet

Geschrieben

@GreenBeret: und was machst du, wenn innerhalb der zeit zwischen select count(*) und select id, text; ein datenstatz eingefuegt wird? im besten fall stimmt nur das array net, aber wahrscheinlich bekommst ne sqlexception oder sowas ...

@Peeter: wie funtzt das mit der arraylist?

Geschrieben

java.util.ArrayList

Schau mal in die JDoc. Da ist dann alles beschrieben.

Ein Element hinzufügen: arl.add(Object);

Ein Elemt holen: arl.get(Index);

Man kann die ArrayList auch in ein Object[] überführen!

Peet

Geschrieben

@GreenBeret: wuerde auch gehen, ok.

@Peeter: hab ich schon ... den index kann ich allerdings nicht zur speicherung der id verwenden ... muesste also auch zweidimensional sein ...

ich schau mal ...

Geschrieben

also, ich hab nun mal ne arraylist gebastelt ...

funtzt auch soweit ganz gut ... allerdings nur mit dem ersten wert. :(

d.h. die felder sind nun alle mit id's gefuellt.

wie bekomm ich nun die 2te 'spalte' ?


	public ArrayList getTableIdResultList( String sql ) {

		ArrayList row;

		ArrayList col;

		try

		{

			row = new ArrayList();

			col = new ArrayList();

			stmt = conn.createStatement();

			rset = stmt.executeQuery( sql );

			ResultSetMetaData rsmdMetaData = rset.getMetaData();

			int columns = rsmdMetaData.getColumnCount();

			for ( int i = 1; i < columns; i++ )

			{

				while ( rset.next() )

				{

					row.add( rset.getObject( i ) );

				}

				col.addAll(row);

			}

			rset.close();

			stmt.close();

		}

		catch ( Exception e )

		{

			e.printStackTrace();

			return null;

		}

		return col;

	}

Geschrieben

java.lang.IndexOutOfBoundsException: Index: 1, Size: 0

at java.util.ArrayList.addAll(ArrayList.java:461)

at de.waltertelemedien.jActivityReport.jARjdbc.getTableIdResultList(jARjdbc.java:147)

??

Geschrieben

so einfach ist es leider nicht ... ;)

aber so funtzt's:


  public ArrayList getTableIdResultList( String sql ) {

    ArrayList row;

    ArrayList col;

    boolean result;

    try

    {

      row = new ArrayList();

      col = new ArrayList();

      stmt = conn.createStatement();

      rset = stmt.executeQuery( sql );

      ResultSetMetaData rsmdMetaData = rset.getMetaData();

      int columns = rsmdMetaData.getColumnCount();

      System.out.println( "sql: " + sql );

      for ( int i = 0; i < columns; i++ )

      {

        result = false;

        while ( rset.next() )

        {

          result = true;

          row.add( rset.getObject( i + 1 ) );

        }

        if ( result == true )

        {

          col.addAll( i, row );

        }

      }

      rset.close();

      stmt.close();


      if ( col.size() <= 0 )

      {

        col.add( "" );

      }

    }

    catch ( Exception e )

    {

      //e.printStackTrace();

      return null;

    }

    return col;

  }

Geschrieben

*narv*

ich bekomm heut noch nen nervenzusammenbruch. :(

das funtzt nicht, dass ich zuerst alle rows, dann alle cols durchgehe. da das resultset dann einmal durchlaufen ist, und ich es nicht zuruecksetzen kann ... *grml*.

dann hab ich es eben umprogrammiert, dass pro row alle cols ausgelesen werden, nun geht das mit den brackets '[]' wieder los. :(

ich werd mir wohl doch ne eigene implementation einer liste schreiben muessen, die meine id und den text dazu speichert ...

Geschrieben
Original geschrieben von -leliel-

ich bekomm heut noch nen nervenzusammenbruch. :(

Dabei ist das doch so einfach, aber du versuchst meine Vorschläge ja nicht einmal. :(


import java.awt.*;

import java.awt.event.*;

import java.sql.*;

import java.util.*;


import javax.swing.*;


public class Start extends JFrame implements ItemListener {


  private JComboBox comboBox;


  public Start() throws Exception {


    Class.forName("org.gjt.mm.mysql.Driver");

    // ResultSet holen

    Connection con = DriverManager.getConnection("jdbc:mysql://localhost/test", "user", "pass");

    Statement stmt = con.createStatement();

    ResultSet resultSet = stmt.executeQuery("select id, text from daten");


    // ArrayList bauen

    ArrayList list = new ArrayList();

    while (resultSet.next()) {

      Datensatz datenSatz = new Datensatz();

      datenSatz.setId(resultSet.getInt("id"));

      datenSatz.setText(resultSet.getString("text"));

      list.add(datenSatz);

    }


    resultSet.close();

    stmt.close();


    // Panel füllen

    JPanel panel = new JPanel();

    comboBox = new JComboBox(list.toArray());

    comboBox.addItemListener(this);

    panel.add(comboBox);

    this.getContentPane().add(panel);

    pack();

    setVisible(true);


  }


  // Frame schließen

  public void processWindowEvent(WindowEvent e) {

    if (e.getID() == WindowEvent.WINDOW_CLOSING) {

      System.exit(0);

    } else {

      super.processWindowEvent(e);

    }

  }


  public static void main(String[] args) {

    try {

      Start start = new Start();

    } catch (Exception e) {

      e.printStackTrace();

    }

  }


  // Auf ComboEvents reagieren

  public void itemStateChanged(ItemEvent e) {

    if (e.getStateChange() == ItemEvent.SELECTED) {

      System.out.println(((Datensatz) comboBox.getSelectedItem()).getId());

    }

  }

}


public class Datensatz {


  private int id;

  private String text;


  public int getId() {

    return id;

  }


  public String getText() {

    return text;

  }


  public void setId(int id) {

    this.id = id;

  }


  public void setText(String text) {

    this.text = text;

  }


  public String toString() {

    return text;

  }

}

Gruß Jaraz

Geschrieben

mein retter ... :hodata

sorry, aber ich hatte deine vorschlaege als 'zu kompliziert' ausgemustert ... :(

werd's mir aber merken und beim naechsten mal (was hoffentlich nicht gleich morgen ist ... will auch mal was selbst hinbekommen :D) eher beachten ... :)

danke vielmals.

Geschrieben
Original geschrieben von -leliel-

sorry, aber ich hatte deine vorschlaege als 'zu kompliziert' ausgemustert ... :(

Das nächste mal versuche ich mich einfacher auszudrücken.

Gruß Jaraz

PS: Das ganze geht übrigens noch komfortabler aber ich glaube das würde jetzt zuweit gehen.:D

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...