Java: MySql Datenbank auslesen

Matze

Weltenwanderer
Hi,

Nach unzäligen Stunden Fehlersuche wende ich mich jetzt an das Forum:

Code:
    int iCounter = 0;
    while(objReSet.next()){
      arMyTableCells[iCounter][0] = new MyTableCells(objReSet.getInt(this.I_CALL_CALL_NR));
      iCounter++;
    }

(objReSet = ein ResultSet-Objekt)

Eigentlich sollte ein Datensatz nach dem anderen in das Array geschrieben werden. Aber durch System.Out's kann man sehen, dass die Schleife nur einmal durchlaufen wird. Lösch ich die Zeile "arMyTableCells[iCounter][0] = new MyTableCells(objReSet.getInt(this.I_CALL_CALL_NR));", dann läuft die Schleife komischer Weiße so oft durch, wie es Datensätze gibt. Fast den gleichen Code habe ich funktionierend in einem anderen Projekt, nur dass ich dort keinen Int sondern ein Objekt aus dem ResultSet hohle.

Hat jemand eine Idee?
 
Hallo,

versuch doch mal das ganze etwas aufzusplitten (falls du das eh nicht schon getan hast).
Zum Beispiel zuerst nur ein
Integer i = objReSet.getInt(0);
in der Schleife durchführen und gucken ob es hinhaut.
Dann ein
MyTableCells cell = new MyTableCells(i);
usw...

So kannst du das Problem wenigstens mal etwas eingrenzen :)
 
Code:
    int iCounter = 0;
    int iTemp = 0;
    while(objReSet.next()){
      iTemp = objReSet.getInt(this.I_CALL_CALL_NR);
      MyTableCells cell = new MyTableCells(iTemp);
      arMyTableCells[iCounter][0] = cell;
      iCounter++;
    }

Wenn ich diese Zeile: MyTableCells cell = new MyTableCells(iTemp); rauskommentiere, dann durchläuft er die Schleife in korrekter Anzahl. Allerdings hat die Klasse MyTableCells keinen Einfluss auf das ResultSet oder den Counter. Wieso also durchläuft er die Schleife dann nur 1 mal?
 
Fliegt da irgendwo eine Exception und du fängst die mit einem leeren catch ab? Führt er den Code unter dem MyTableCells cell = new MyTableCells(iTemp); noch aus?

Was macht der Konstruktor von MyTableCells?
 
Code:
/**
   * Konstruktor
   */
  public MyTableCells(int _iCallNumber) {
    try{
      this.iCallNumber = _iCallNumber;
      this.jbInit();
    }catch(Exception ex){ex.printStackTrace();}
  }

Ich habe keinen leeren catch. jbInit() initialisiert alle Komponennten (Klasse stellet ein JPannel mit Inhalt dar).
 
Ich revidiere mal meine Aussage, habe den Beitrag nochmal genau durchgelesen.

Aber wie wäre es wenn du dir erst mal ein Objekt rausholst und das dann auf Int castest?
 
Zuletzt bearbeitet von einem Moderator:
Ja ich habe in der API nachgelesen und das suspekte, in meinem MySQL Explorer den ich programmiert habe funktioniert dies genauso. Nein dieses ResultSet belege ich nicht neu.

Hier noch mehr Code:

Methode die die Daten für die Tabelle erstellt (in der Klasse in der die Tabelle erstellt wird):
Code:
 //Erstellt die Daten fr die Tabelle
  private MyTableCells[][] createTableData() throws Exception{
    ResultSet objReSet = null;
    ResultSet objReSet2 = null;
    int iRowCount = 0;
    if(this.jtpCallType.getSelectedIndex() == this.I_INNCOMING_CALL){
      objReSet2  = DBConnection.objStat.executeQuery("SELECT COUNT(*) FROM Call WHERE CallDirection = " + this.I_INNCOMING_CALL + ";");
      objReSet2.next();
      iRowCount = objReSet2.getInt(1);
      objReSet  = DBConnection.objStat.executeQuery("SELECT * FROM Call WHERE CallDirection = " + this.I_INNCOMING_CALL + ";");
    }
    else{
      objReSet2  = DBConnection.objStat.executeQuery("SELECT COUNT(*) FROM Call WHERE CallDirection = " + this.I_GOING_OUT_CALL + ";");
      objReSet2.next();
      iRowCount = objReSet2.getInt(1);
      objReSet = DBConnection.objStat.executeQuery("SELECT * FROM Call WHERE CallDirection = " + this.I_GOING_OUT_CALL + ";");
    }

    MyTableCells arMyTableCells[][] = new MyTableCells[iRowCount][1];
    System.out.println("iRowCount:  " + iRowCount);
    int iCounter = 0;
    int iTemp = 0;
    while(objReSet.next()){
      iTemp = objReSet.getInt(this.I_CALL_CALL_NR);
      MyTableCells cell = new MyTableCells(iTemp);
      arMyTableCells[iCounter][0] = cell;
      iCounter++;
    }
    System.out.println("iCounter: " + iCounter);
    return(arMyTableCells);
  }

Klasse MyTableCells:
Code:
package anrufsarchiv;

import java.util.*;
import javax.swing.*;
import java.sql.*;
import info.clearthought.layout.*;
import javax.swing.border.*;
import java.awt.*;

/**
 * berschrift:   Anrufsarchiv
 * Beschreibung:
 * Copyright:     Copyright (c) 2007
 * Organisation:  HWI
 * @author Knoblach Matthias
 * @version 1.0
 */

public class MyTableCells extends JPanel implements MyIcons, FieldKeys{

  private double arLayoutRows[] = {TableLayout.FILL}; //Die Reihen des TableLayouts
  private double arLayoutColumns[] = {20, 50, 50, TableLayout.FILL}; //Die Spalten des TableLayouts
  private TableLayout objMyTableLayout = new TableLayout(arLayoutColumns, arLayoutRows);//Erstellen des Table Layouts
  private int iCallNumber;

  JLabel jlblIconField     = new JLabel();
  JLabel jlblDateTime      = new JLabel();
  JLabel jlblDialogPartner = new JLabel();
  JLabel jlblReason        = new JLabel();

  /**
   * Konstruktor
   */
  public MyTableCells(int _iCallNumber) {
    try{
      this.iCallNumber = _iCallNumber;
      this.jbInit();
    }catch(Exception ex){ex.printStackTrace();}
  }

  /**
   * Initialisierung alle Komponennten
   */
  private void jbInit() throws Exception{

    //Umrandung der Labels setzen
    this.setAllBorder();

    //Labels mit Inhalt fllen
    this.fillLabels();

    //Komponenten hinzufgen
    this.add(this.jlblIconField, "0,0");
    this.add(this.jlblDateTime, "1,0");
    this.add(this.jlblDialogPartner, "2,0");
    this.add(this.jlblReason, "3,0");

  }

  private void fillLabels() throws Exception{
    ResultSet objReSet = DBConnection.objStat.executeQuery("SELECT * from Call WHERE CallNr = " + this.iCallNumber + " ;");
    objReSet.next();

    //Priorits-Label
    this.jlblIconField.setIcon(this.arIcons[objReSet.getInt(this.I_CALL_PRIORITY)]);

    //Datum und Uhrzeit Label
    String strTime = objReSet.getTime(this.I_CALL_CALL_TIME).toString();
    strTime = strTime.substring(0, strTime.lastIndexOf(":"));
    this.jlblDateTime.setText(createTimeDateText(objReSet.getTime(this.I_CALL_CALL_TIME), objReSet.getDate(this.I_CALL_CALL_DATE)));

    //Namens-Label
    this.jlblDialogPartner.setText(objReSet.getString(this.I_CALL_DIALOG_PARTNER_TOKEN));

    //Grund-Label
    this.jlblReason.setText(objReSet.getString(this.I_CALL_REASON_TOKEN));
  }

  /**
   * Gibt einen String zurck, der die bergebene Uhrzeit und das bergebene
   * Datum formatiert zurckgibt
   */
  private String createTimeDateText(Time _time, java.util.Date _date){
    String strTime = _time.toString();
    strTime = strTime.substring(0, strTime.lastIndexOf(":"));
    Calendar calDatum = Calendar.getInstance(TimeZone.getTimeZone("ECT"), new Locale("de", "DE"));
    calDatum.setTime(_date);
    String strDate = String.valueOf(calDatum.get(Calendar.DAY_OF_MONTH)) + "." +
		     String.valueOf(calDatum.get(Calendar.MONTH) + 1) + "." +
		     String.valueOf(calDatum.get(Calendar.YEAR));
    return(strTime + " - " + strDate);
  }

  //Hier werden die Umrandungen fr die Komponennten gesetzt
  private void setAllBorder(){
    Border objMyRaisedBorder = BorderFactory.createLineBorder(Color.black,1);

    this.jlblIconField.setBorder(objMyRaisedBorder);
    this.jlblDateTime.setBorder(objMyRaisedBorder);
    this.jlblDialogPartner.setBorder(objMyRaisedBorder);
    this.jlblReason.setBorder(objMyRaisedBorder);
  }
}I
 
Sorry hab jetzt erst gelesen, dass du deinen Beitrag geändert hast.

Leider klappt deine Idee mit dem Objekt auch nicht :(
 
Wo wird die statische Variable "I_CALL_CALL_NR" deklariert? Bzw. mit was oder wo wird sie neubelegt?
 
Zurück