# isLast() Probleme bei Pervasive



## Reggie (20. Okt 2010)

Tach zusammen,

Ich habe ein problem mit Pervasive und der Methode isLast() im ResultSet. Obwohl das ResultSet ein Type_Forward_Only ist wirft es eine Exception "Incorrect Cursor Type". Ich hab das ganze mal gegoogelt aber nichts gefunden. Hat jemand eine Idee?

isLast wird auf zeile 36 aufgerufen.

Hier mein Code:

```
Connection conn = (Connection) Def.getConn();
        Statement st;
        ResultSet rs;
        String[] DKOList = new String[]{"13", "106"};

        try {
            st = (Statement) conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            rs = (ResultSet) st.executeQuery("Select Produkt.\"_USERFIELD8\" as SpezialNR, Produkt.\"_USERFIELD1\" as DZNR, Produkt.\"_USERFIELD2\" as EZNR, Produkt.\"_USERFIELD3\" as VERPNR, "
                    + "ADRE_AKT.LINK, DEBI_DST.DNR, PUBL_AKP.ADR_INR, PUBL_ADR.EMAIL, "
                    + "Kontakt.\"_USERFIELD8\" as Tagung, Kontakt.\"_USERFIELD7\"as Spezial, Kontakt.\"_USERFIELD3\" as DZ, Kontakt.\"_USERFIELD4\" as EZ, Kontakt.\"_USERFIELD5\" as Verpf "
                    + "from ADRE_AKT "
                    + "join ADRE_AKT_EXT as Aktiv on (ADRE_AKT.RECNUM$ = Aktiv.PARENT_RECNUM$) "
                    + "join ORDE_ADO on(ADRE_AKT.LINK = ORDE_ADO.ART_NRA) "
                    + "join ORDE_ADO_EXT as Produkt on (ORDE_ADO.RECNUM$ = Produkt.PARENT_RECNUM$) "
                    + "join PUBL_ADR on (ADRE_AKT.ADR_INR = PUBL_ADR.INR) "
                    + "join PUBL_AKP on (PUBL_ADR.INR = PUBL_AKP.ADR_INR and PUBL_AKP.FREI2SW = '1') "
                    + "Join PUBL_AKP_EXT as Kontakt on (PUBL_AKP.RECNUM$ = Kontakt.PARENT_RECNUM$) "
                    + "left outer join DEBI_DST on (PUBL_ADR.INR = DEBI_DST.INR) "
                    + "Where ADRE_AKT.LINK = '" + CourseNr + "' and ADRE_AKT.AKA_ID ='KITA'" + AdreCheck);
            switch(rs.getType()){
                case 1003: System.out.println("TYPE_FORWARD_ONLY");break;
                case 1004: System.out.println("TYPE_SCROLL_INSENSITIVE");break;
                case 1005: System.out.println("TYPE_SCROLL_SENSITIVE");break;
            }
            float DZMenge = 0;
            float EZMenge = 0;
            float Verpf = 0;
            float Tagung = 0;
            float Spezial = 0;
            while (rs.next()) {
                if (rs.getInt("DEBI_DST.DNR") == 0) {
                    fail++;
                    fail2.add(rs.getString("ADR_INR"));
                }
                if (fail == 0) {
                    if ((tmpAdre != rs.getInt("ADR_INR") && tmpAdre != 0)|| rs.isLast()) {
                        String[] DKOWerte = new String[]{rs.getString("DNR"), rs.getString("LINK")};
                        try {
                            buffy.write(",N,DKO");
                            buffy.newLine();
                            for (int a = 0; a < DKOList.length; a++) {
                                buffy.write(",D,DKO," + DKOList[a] + "," + DKOWerte[a]);
                                buffy.newLine();
                            }
                            buffy.write(",S");
                            buffy.newLine();
                            if (Tagung > 0) {
                                buffy.write(",N,DPO");
                                buffy.newLine();
                                buffy.write(",D,DPO,6," + "A");
                                buffy.newLine();
                                buffy.write(",D,DPO,7," + rs.getString("LINK"));
                                buffy.newLine();
                                buffy.write(",D,DPO,12," + String.valueOf(Tagung));
                                buffy.newLine();
                                buffy.write(",S");
                                buffy.newLine();
                            }
                            if (DZMenge > 0) {
                                buffy.write(",N,DPO");
                                buffy.newLine();
                                buffy.write(",D,DPO,6," + "B");
                                buffy.newLine();
                                buffy.write(",D,DPO,7," + rs.getString("DZNR"));
                                buffy.newLine();
                                buffy.write(",D,DPO,12," + String.valueOf(DZMenge));
                                buffy.newLine();
                                buffy.write(",S");
                                buffy.newLine();
                            }
                            if (EZMenge > 0) {
                                buffy.write(",N,DPO");
                                buffy.newLine();
                                buffy.write(",D,DPO,6," + "B");
                                buffy.newLine();
                                buffy.write(",D,DPO,7," + rs.getString("EZNR"));
                                buffy.newLine();
                                buffy.write(",D,DPO,12," + String.valueOf(EZMenge));
                                buffy.newLine();
                                buffy.write(",S");
                                buffy.newLine();
                            }
                            if (Verpf > 0) {
                                buffy.write(",N,DPO");
                                buffy.newLine();
                                buffy.write(",D,DPO,6," + "B");
                                buffy.newLine();
                                buffy.write(",D,DPO,7," + rs.getString("VERPNR"));
                                buffy.newLine();
                                buffy.write(",D,DPO,12," + String.valueOf(Verpf));
                                buffy.newLine();
                                buffy.write(",S");
                                buffy.newLine();
                            }
                            if (Spezial > 0) {
                                buffy.write(",N,DPO");
                                buffy.newLine();
                                buffy.write(",D,DPO,7," + rs.getString("Spezial"));
                                buffy.newLine();
                                buffy.write(",D,DPO,6," + "B");
                                buffy.newLine();
                                buffy.write(",D,DPO,12," + String.valueOf(Verpf));
                                buffy.newLine();
                                buffy.write(",S");
                                buffy.newLine();
                            }
                        } catch (IOException ex) {
                            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        DZMenge = 0;
                        EZMenge = 0;
                        Verpf = 0;
                        Tagung = 0;
                        Spezial = 0;
                        if (canc == 0) {
                            Runtime rt = Runtime.getRuntime();
                            Process z;
                            try {
                                //if (rs.getString("PUBL_ADR.EMAIL").equals("")) {
                                z = rt.exec(Def.getAbaview().getAbsolutePath() + " -q1='" + CourseNr + "' -q2='" + AdreNr == null ? rs.getString("PUBL_ADR.INR") : AdreNr + "' -p " + Def.getReport().getAbsolutePath());
                                z.waitFor();
                                //} else {
                                //    z = rt.exec(Def.getAbaview().getAbsolutePath() + " -q1='" + CourseNr + "' -q2='" + AdreNr == null ? rs.getString("PUBL_ADR.INR") : AdreNr + "' -pMailTo:" + rs.getString("PUBL_ADR.EMAIL") + " " + Def.getMailReport().getAbsolutePath());
                                //    z.waitFor();
                                //}


                            } catch (InterruptedException ex) {
                                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                            } catch (IOException ex) {
                                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                    Tagung = Tagung + rs.getFloat("Tagung");
                    Spezial = Spezial + rs.getFloat("Spezial");
                    Verpf = Verpf + rs.getFloat("Verpf");
                    EZMenge = EZMenge + rs.getFloat("EZ");
                    DZMenge = DZMenge + rs.getFloat("DZ");
                    tmpAdre = rs.getInt("ADR_INR");
                }
            }
            st.close();
            conn.close();
            try {
                buffy.close();
            } catch (IOException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
```


----------



## Michael... (20. Okt 2010)

Vielleicht unterstützt der Datenbanktreiber diese Methode nicht. Was für eine Exception tritt denn auf und wie lautet die genaue Fehlermeldung?


----------



## Reggie (20. Okt 2010)

TYPE_FORWARD_ONLY
20.10.2010 09:49:05 auftragsschnittstelleKirhgemeindetagungen.Main main
SCHWERWIEGEND: null
java.sql.SQLException: Incorrect cursor type
        at com.pervasive.jdbc.lna.ForwardReadResultCache.isRow(ForwardReadResult
Cache.java:190)
        at com.pervasive.jdbc.v2.ResultSet.isLast(ResultSet.java:729)
        at auftragsschnittstelleKirhgemeindetagungen.Main.main(Main.java:114)


----------



## Gast2 (20. Okt 2010)

Was möchtest du mit dem Konstrukt hier denn erriechen?


```
if (rs.getInt("DEBI_DST.DNR") == 0) {
                    fail++;
                    fail2.add(rs.getString("ADR_INR"));
                }
                if (fail == 0) {
                    if ((tmpAdre != rs.getInt("ADR_INR") && tmpAdre != 0)|| rs.isLast()) {
```

Das sieht mir eher so aus als wenn du einen ganz bestimmten Datensatz suchst? Das sollte man dann aber direkt in der Datenbank mit SQL filtern. Versuch doch  bitte mal zu beschreiben was das eigentlich soll?

Zweitens:

Dein Methode ist viel zu lang! Der code ist toal unübersichtlich, versuch das mal etwas besser zu kapseln und in weitere Methoden auszulagern. Refactoring heißt das Zauberwort: 
Refactoring

Drittens:
Du solltest besser ein PreparedStatement verwenden als den Query aus Strings zusammenzukonkatenieren.


----------



## Reggie (20. Okt 2010)

Danke für die Feedbacks erstmal!

Ich weiss der Code ist ziemlich chaotisch. Musste einfach schnell her für eine einfach Schnittstelle, es wurde viel nachgebessert und geplant wurde vorher auch nichts. 

Mit diesem Konstrukt muss ich erreichen das verschiedene Datensätze miteinander addiert werden und sobald der Kunde wechselt das als ein Datensatz abgespeichert wird. Das isLast ist dazu da das bei letzten Datensatz das ganze weitergegeben wird obwohl ja kein neuer Kunde mehr kommt. 

Ist Flickwerk und wird Flickwerk bleiben, ich denke auch das ich das ohne isLast() auch irgendwie lösen, nur möchte ich gerne wissen warum diese Methode nicht funktioniert.

Edit: Bei der if null abfrage geht es darum ob ein Debitor eröffnet wurde auf der Adresse. falls nicht soll er nurnoch die Adressnummern ohne Debitor sammeln. Da ohne Debitor keine Rechnung versendet werden kann und diese dann mit Standartwerten eröffnet werden.

PreparedStatement kann ich leider nicht verwenden da ich je nach Parameter nach einer bestimmten Adressnummer suche oder sonst alle haben will. War für mich die beste Lösung am das ganze nicht 2 mal schreiben zu müssen.


----------



## Reggie (21. Okt 2010)

Also nach intensiver Recherche habe ich den Fehler gefunden. Die ResultSet Klasse von Java kann isLast nur ausführen wenn das resultSet vom Typ Forward Only ist. Bei Pervasive jedoch muss es der Typ Scroll insensitiv sein.

Vielen Dank für die Wortmeldungen und "Sorry" für den unübersichtlichen Code. 

Have a Nice Day!


----------

