Avatar billede tl Nybegynder
19. december 2000 - 01:48 Der 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 ??

EN lidt svær nød syntes jeg....
Avatar billede mpultz Nybegynder
19. december 2000 - 08:44 #1
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.
Avatar billede davsclaus Nybegynder
19. december 2000 - 17:24 #2
Hvordan kalder du din bean fra jsp?

<useBean id=\"mySQLBean\" class=\"bla bla\"/>

Du kan jo kalde din bean\'s fra jsp som rigtig javakode i <%  ... %> taggen.

f.eks.


<% ResultSet rs1 = mySQLBean.execSQL(\"SELECT * FROM USERS\"); %>

og senere kan du blot

<% ResultSet rs2 = mySQLBean.execSQL(\"SELECT * FROM PRODUCT\"); %>


altså gemme hver ResultSet i hver sin variabel (rs1 og rs2)

Claus
Avatar billede tl Nybegynder
19. december 2000 - 22:11 #3
Hej.

Svaret et vidst ikke så enkelt, da et der kun kan være et resultsæt per statement.

Hvordan kan man lave en statement per kald til metoden, man kan jo ikke lave et new Statement, da dette er et interface.

Her er min kode i DbBean :

public ResultSet execSQL(String sql) throws
SQLException
  {  Statement s = dbCon.createStatement();
    ResultSet r = s.executeQuery(sql);
    return (r == null) ? null :r;
  }

Og sådan bliver den kaldt i JSP :

String SQLPicTag = (\"SELECT * FROM PICTURES WHERE OID=\'\"+LogoPictureOID+\"\'\");

rs_PicTag        = DbCon.execSQL(SQLPicTag);

To problemer eksiterer : Hvordan bruger man execSQL flere gange på samme side, og hvordan lukker man statement/resultsættet på JSP siden.

Der må være en fiksere løsning.....
Avatar billede mpultz Nybegynder
20. december 2000 - 10:45 #4
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.
Avatar billede tl Nybegynder
20. december 2000 - 12:47 #5
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.                                                                                                                   
Avatar billede mpultz Nybegynder
20. december 2000 - 17:13 #6
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?
Avatar billede tl Nybegynder
20. december 2000 - 18:10 #7
Oracle, 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 ??

Tak
Tore
Avatar billede mpultz Nybegynder
20. december 2000 - 20:51 #8
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); }
  }
}
Avatar billede tl Nybegynder
21. december 2000 - 12:07 #9
Du får heller ikke lukket dine cursors i ovenstående eksempel.

Hmm, mærkeligt, hvorfor får jeg mon så errormeddelelsen :

Exception details:

java.sql.SQLException: Opbrugt resultatsæt
Opbrugt resultatsæt

Du får heller ikke lukket dine cursors i ovenstående eksempel.

Tore
Avatar billede mpultz Nybegynder
22. december 2000 - 10:16 #10
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester