JTable zeigt nich die Daten aus der DB (Ms Access) ?

Code46

Erfahrenes Mitglied
Hi Leute,

Ich versuche in einem JTable alle Daten von der DB Tabelle anzuzeigen. Jedoch funktioniert dies nicht. Könnt ihr mir vielleicht tip geben.

Hier mein Code:

Code:
        final Vector<Vector<String>> data = (Vector<Vector<String>>) DBEngine.listAll();
        // create header for the table
        final Vector<String> header = new Vector<String>();
        header.add("StudentID"); 
        header.add("Student Name"); 
        header.add("Student Lastname"); 
        header.add("Student Email"); 
        header.add("StudentsRFID"); 
 
        final JTable table = new JTable(data, header);

// Dies ist in der Klasse DBEngine()
public static ResultSet listAll(){
    try{
        ResultSet results = myStatement.executeQuery(
        "SELECT * FROM Student ORDER BY Name");return results;
    }
    catch(Exception e){}
    return null;
}


Würde mich auf eure post freuen.

Danke
 

Akeshihiro

Erfahrenes Mitglied
Die Methode listAll() müsste nicht das ResultSet zurückgeben, sondern einen Vector, den du aber erst mit den Daten des ResultSets füllen musst. So kann das nicht funktionieren und es müsste eigentlich auch einen ClassCastException kommen.
 

Code46

Erfahrenes Mitglied
Ich habe hier sowas gecodet jedoch ist dort ein fehler in Zeile 27:

Code:
public class DBEngine{
  private static Statement myStatement;

    public static void  DBConnection()
    {

     {
        try
        {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        String sourceURL ="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=StudentRegister.mdb;;";
        Connection userDB =DriverManager.getConnection(sourceURL, "admin", "");
        myStatement = userDB.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        }

        
        catch(ClassNotFoundException cnfe){JOptionPane.showMessageDialog(null,cnfe);}
        catch(SQLException sqle){JOptionPane.showMessageDialog(null,sqle);}
    }

   }

public Vector getStudentRecord()throws Exception
{
Vector<Vector<String>> StudentVector = new Vector<Vector<String>>();

Connection conn = DBConnection(); // Hier kommt ein Fehler: Incompatible types required java.sql.connection . Found void 
PreparedStatement pre = conn.prepareStatement("select * from Student");

ResultSet rs = pre.executeQuery();

while(rs.next())
{
Vector<String> stundent = new Vector<String>();
stundent.add(rs.getString(1)); 
stundent.add(rs.getString(2)); 
stundent.add(rs.getString(3)); 
stundent.add(rs.getString(4)); 
stundent.add(rs.getString(5));
StudentVector.add(stundent);
}

/*Close the connection after use (MUST)*/
if(conn!=null)
conn.close();

return StudentVector;
}
 

javaDeveloper2011

Erfahrenes Mitglied
Hi,

das Problem hier ist, dass DBConnection void (also nichts) zurückgibt, du willst der Variablen conn aber den Rückgabewert zuweisen => FEHLER!
In DBConnect müsste also return userDB; stehen (im try) und dann ins catch noch returm null.

Weiß zwar nicht wie das ganze benutzt werden soll, aber hier mal ein Verbesserungsvorschlag:
Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

public class DBEngine {
	
	private Connection connection;
	private PreparedStatement preparedStatement;
 
    public DBEngine() throws ClassNotFoundException, SQLException {
		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		connection = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=StudentRegister.mdb;;", "admin", "");
		preparedStatement = connection.prepareStatement("select * from Student");
    }
 
    public Vector<Vector<String>> getStudentRecord() throws SQLException {
    	Vector<Vector<String>> studentVector = new Vector<Vector<String>>();
     	ResultSet rs = preparedStatement.executeQuery();
    	while(rs.next()){
			Vector<String> stundent = new Vector<String>();
			for(int i=1; i<=5; i++)
				stundent.add(rs.getString(i));
			studentVector.add(stundent);
		}
    	return studentVector;
    }
    
    public void close() throws SQLException {
    	if(connection != null)
    		connection.close();
    }
    	
}
 

Code46

Erfahrenes Mitglied
Danke für deinen Post. Habe jedoch noch eine frage. Undzwar möchte ich gerne sachen in die Datenbank speichern. Muss ich das durch Vectoren machen oder wie mache ich das ?

Hier mein Code:
Code:
public static boolean writeData(String ID,String FistName, String LastName, String StudentEmail,String StudentRFID)
   {
    String writeString =("INSERT INTO Student(StudentId,StudentFirstName,StudentLastName,StudentEmail,StudRFID) VALUES('"+ID+"', '"+ FistName+"' ,'"+LastName+"','"+StudentEmail+"','"+StudentRFID+"')");
    
    try
    {
    myStatement.executeUpdate(writeString);
    }
    catch(SQLException sqle){JOptionPane.showMessageDialog(null,"User Error");return false;}
    return true;
}
 

javaDeveloper2011

Erfahrenes Mitglied
Hi Code46,

müsste eigentlich so gehen, trotzden hier noch mal ne "schönere" Gesamt-Version:
Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
 
public class DBEngine {
    
    private Connection connection;
    private PreparedStatement preparedStatement;
    private Statement statement;
 
    public DBEngine() throws ClassNotFoundException, SQLException {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        connection = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=StudentRegister.mdb;;", "admin", "");
        statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        preparedStatement = connection.prepareStatement("select * from Student");
    }
 
    public Vector<Vector<String>> getStudents() throws SQLException {
        Vector<Vector<String>> studentVector = new Vector<Vector<String>>();
        ResultSet rs = preparedStatement.executeQuery();
        while(rs.next()){
            Vector<String> stundent = new Vector<String>();
            for(int i=1; i<=5; i++)
                stundent.add(rs.getString(i));
            studentVector.add(stundent);
        }
        return studentVector;
    }
    
    public void addStudent(String id, String fistName, String lastName, String eMail,String rfid) throws SQLException {
    	statement.executeUpdate("INSERT INTO Student(StudentId, StudentFirstName, StudentLastName, StudentEmail, StudRFID) VALUES('" + id + "', '" + fistName + "' ,'" + lastName + "','" + eMail + "','" + rfid+ "')");
    }
    
    public void close() throws SQLException {
        if(connection != null)
            connection.close();
    }
        
}
 

Code46

Erfahrenes Mitglied
Vielen Dank es Funktioniert einwand frei.

Sorry aber habe doch eine kleine bitte. Du hast jetzt addStudent als void gesetzt brauche jedoch ein Boolean. Weil ich hier es als boolean übergebe.
Weil versuche gerade in einer anderen klasse diese method aufzurufen und die Werte zu übergeben.
Versuche auch die Methode DBEngine() aufzurufen jedoch funktioniert das nicht ?
Code:
        if (e.getSource() == addRecButton)
            {
            try
                {
                    firstname = addRecFName.getText();
                    lastname = addRecLName.getText();
                    email = addRecEmail.getText();
                    RFID = addStudentRFID.getText();
                    ID = addRecID.getText();
                    
                    if (firstname.equals("") ){
                        JOptionPane.showMessageDialog(this,"Please enter Students First Name");
                    return;}
                    
            
                    if (lastname.equals("") ){
                        JOptionPane.showMessageDialog(this,"Please enter Students Last Name");
                    return;}
                    
                    if (email.equals("") ){
                        JOptionPane.showMessageDialog(this,"Please enter Students Email address");
                    return;}
                    
                    if (RFID.equals("") ){
                        JOptionPane.showMessageDialog(this,"Please enter Students RFID Number");
                    return;}                   
                    
                    if (ID.equals("") ){
                        JOptionPane.showMessageDialog(this,"Please enter Students ID Number");
                    return;}
                    
                    
                
                }
                catch(NumberFormatException excp){
                JOptionPane.showMessageDialog(this, " Please enter price of DVD(numbers only)");
                return;
                }
                DBEngine.DBEngine(); //  Can not find Symbol

                ok = DBEngine.addStudent(ID,firstname, lastname, email,RFID); // Non-static Method. Boolean reqiured. Void found
                
                if (ok)
                    {
                    JOptionPane.showMessageDialog(this, firstname+""+lastname+""+" successfully addd to Database");
                    clearFields();
                    }
                if (!ok) {
                    JOptionPane.showMessageDialog(null, "Student NOT added" );
                    }
         }
 
Zuletzt bearbeitet: