19. december 2000 - 01:48Der er
9 kommentarer og 1 løsning
Java Data Bean
Jeg har et par JSP sider der bruger en JavaBean til adgang til en Database.
mit problem er at min metode execsql, der kører en sql forspøgsel kun kan bruges en gang per side, da den jo kører på den samme statement, som kun kan være tilknyttet et resultsæt.
Måske er løsningen at lægge alle data over i en multidimensional array fra et resultsæt, måske findes der ikke en sådan metode ??
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Returnerer execsql et ResultSet? Opretter din execsql ikke et nyt Statement/PreparedStatement objekt per kald? Hvis den gør det kan jeg ikke se hvad problemet er da en sætning så er tilknyttet et resultatsæt.
Ang. problem 1: Du kan vel godt kalde execSQL() flere gange, da metoden ved hvert kald genererer et Statement objekt. Der kan godt være flere sætninger tilknyttet et Connection objekt.
Ang. problem 2: Få execSQL til også at returnere Statement objektet, f.eks. returtype Object[] som så indeholder et ResultSet og et Statement. Når du er færdig luk resultatsæt, dernæst sætning.
Ang. problem 1. Hver statement generer ikke et nyt statement/resultset object (interface), og jeg får error : opbrugt resultatsæt, ved at kalde funktionen flere gange på samme side.
Et gæt: Måske hænger problem 2 sammen med problem 1 idet du ikke lukker sætninger, dvs. først luk resultatsæt og dernæst sætning. Måske har et Connection objekt et maximum for hvor mange sætninger der kan være aktive samtidigt og idet du ikke lukker dem overskrides grænsen på et tidspunkt. Hvor mange gange kalder du execSQL()? Hvilket DBMS benytter du? Hvilken JDBC driver?
Kan kun kalde execSQL() en gang for hver side, da jeg bruger den samme statement i execSQL. Kan ikke se hvordan jeg kan få den til at bruge en ny hver gang.
Det bedste ville nok være at lave en funktion der returnerede et multi-dimensional array for hver kald til funktionen, mon en sådan ikke eksiterer i forvejen ??
Jeg kan ikke forstå hvorfor du siger at du bruger den samme statement flere gange ved brug af execSQL(). Kaldet dbCon.createStatement() opretter en ny sætning. Nedenstående illustrerer dette. Her oprettes en sætning med tilhørende resultatsæt 10 gange. Eksemplet virker også hvis SELECT forespørgslen er forskellig fra iteration til iteration. DBMS er Access (ja, databasesystem er måske så meget sagt) med ODBC-JDBC bridge driveren.
import java.sql.*;
public class Eksperten { private static Connection conn;
public static ResultSet execSQL(String sql) throws SQLException { Statement s = conn.createStatement(); ResultSet r = s.executeQuery(sql); return (r == null) ? null :r; }
public static void main(String[] args) { try { ConnectionPool pool = new ConnectionPool(DBExample.DRIVER, DBExample.URL, DBExample.USER, DBExample.PASSWORD); conn = pool.getConnection(); ResultSet[] rset = new ResultSet[10]; for(int i = 0; i < rset.length; ++i) { rset[i] = execSQL(\"SELECT id FROM Binders\"); } for(int i = 0; i < rset.length; ++i) { while (rset[i].next()) System.out.print(rset[i].getInt(1) + \"\\t\"); System.out.println(); } } catch (Exception e) { System.out.println(e); } } }
Hvornår helt præcis rejses undtagelsen? Er det under eksekvering af executeQuery() eller er det først når du tilgår resultatsættet? Gætter på det første men for at være sikker.
Får du samme fejlmeddelelse hvis du kører mit ovenstående eksempel. Hvis ikke må det være JSP specifikt.
Mads
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.