Avatar billede glahn Nybegynder
02. februar 2001 - 10:16 Der er 34 kommentarer og
1 løsning

hente info OM database

I MySQL kan jeg bruge describe table, show tables osv.

Hvordan bruger jeg disse ting vha. jsp?

Der er vist nok noget med getMetaData, men jeg kan absolut ikke finde ud af at bruge det.
Avatar billede kresten Nybegynder
02. februar 2001 - 10:25 #1
Ja, det er getMetaData du skal bruge.

Prøv evt. at se på http://java.sun.com/docs/books/tutorial/jdbc/index.html

Men Sun havde en rigtig god JDBC tutorial som hed \"JDBC Short course\", men sitet er lavet om :(
Prøv at gå ind på http://developer.java.sun.com og find mere????
Avatar billede disky Nybegynder
02. februar 2001 - 10:35 #2
prøv
http://java.sun.com/j2se/1.3/docs/api/java/sql/ResultSetMetaData.html

Det er API dokumentationen på den klasse du får et objekt fra når du bruger getMetaData

Håber det hjælper

Avatar billede glahn Nybegynder
02. februar 2001 - 10:56 #3
Tak skal I ha\'... Jeg kender godt alle de der sider, og jeg har cyklet rundt på dem i lang tid, men jeg bliver desværre ikke klogere....

Mit store problem er, at jeg ikke er velbevandret nok udi Java til at kunne gennemskue, hvordan jeg bruger alle de der ting.

Jeg er nået så langt at jeg har kodet dette :

RS = Stmt.executeQuery(\"describe tabelnavn\");
rsmd = RS.getMetaData();
-
-
<%= rsmd %>

Og det giver mig bare noget i retning af, hvad datbasen hedder, og hvor den ligger.....
Avatar billede disky Nybegynder
02. februar 2001 - 10:57 #4
Hvilke oplysninger er det du gerne vil have at vide om basen ?
Avatar billede glahn Nybegynder
02. februar 2001 - 11:01 #5
de samme som jeg får ved describe i MySQL :
Kolonnenavn,datatype,not null, primary key osv.

Jeg skal bruge det til, altid at have en opdateret dokumentation for, hvordan min database er opbygget.
Avatar billede disky Nybegynder
02. februar 2001 - 11:04 #6
jeg synes eksemplet på den side jeg linkede til siger alt :-)


ResultSet rs = stmt.executeQuery(\"SELECT a, b, c FROM TABLE2\");
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

Hvis du vil vide hvad for en type kolonne 0 er så:

int type = rsmd.getColumnType(0);

hvilken type \'type\' er kan du se i klassen
http://java.sun.com/j2se/1.3/docs/api/java/sql/Types.html

det samme gælder alle de andre funktioner.

Hjalp det lidt ?
Avatar billede glahn Nybegynder
02. februar 2001 - 11:17 #7
og så får jeg internal servlet error
javax.servlet.ServletException:
og
Root cause:
java.lang.NullPointerException:

Avatar billede disky Nybegynder
02. februar 2001 - 11:21 #8
Det var jo også kun en stump af kode :-)

Prøv med

Class.forName(\"org.gjt.mm.mysql.Driver\").newInstance();
Connection con = DriverManager.getConnection(\"jdbc:mysql://localhost/ClassOf2000\",\"root\", \"root\");
Statement stmt = con.createStatement();
                       
ResultSet rs = stmt.executeQuery(\"SELECT a, b, c FROM TABLE2\");
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();


jeg har ikke testet det men det skulle virke. Selvfølgelig skal a,b,c byttes ud med navnene på dine kolonner eller hele query med \'select * from tabelnavn\'
Avatar billede glahn Nybegynder
02. februar 2001 - 11:31 #9
Alt det har jeg gjort (normalt kan jeg jo sagtens finde ud af at hente data fra mine tabeller og manipulere med dem...) OG så opdagede jeg at der jo skulle try og catch rundt om noget af det, så lige nu får jeg følgende :

Variable numberOfColumns may not have been initialized.
                out.print( numberOfColumns );
                         
Til trods for at jeg har skrevet :
<% int numberOfColumns;%>
og
numberOfColumns = rsmd.getColumnCount(); inden i en try/catch

???????????????????
Avatar billede kresten Nybegynder
02. februar 2001 - 11:33 #10
hvis du skriver int foran numberOfColumns tildeler du jo \"ikke noget\" til variablen numberOfColumns.
Avatar billede disky Nybegynder
02. februar 2001 - 11:34 #11
prøv at sæt numberOfColumns=0

Hvis du bruger variablen udenfor try/catch er den ikke altid sat til noget hvis der kommer en exception.
Avatar billede glahn Nybegynder
02. februar 2001 - 11:42 #12
Så er vi tilbage ved internal servlet error.....

Jeg har også prøvet at erklære variablerne globalt og lokalt..... ingen ændring!
Avatar billede glahn Nybegynder
02. februar 2001 - 11:44 #13
Lige nu ser koden således ud:
<%! int numberOfColumns; %>
<%! int type; %> 
<%    numberOfColumns = 0; %>
<%
try
    {
      type = rsmd.getColumnType(0);
  numberOfColumns = rsmd.getColumnCount();
    }
catch (SQLException e) { //Hvis noget gik galt
  out.println(\"SQLException: \" + e.getMessage());
  out.println(\"SQLState:    \" + e.getSQLState());
  out.println(\"VendorError:  \" + e.getErrorCode());
}
%>

<%= rsmd %>
<%= numberOfColumns %>
Avatar billede kresten Nybegynder
02. februar 2001 - 11:47 #14
Jammen skal du ikke bare skrive

<%=numberOfColumns%>

i JSP siden
.. og så er den i vinkel??????

Prøv evt lige at lave en Systen.out.println(numberOfColumns); i din servlet. Hvis den skriver det rigtigt ud så er det jo 100% sikkert JSP siden den er galt med.
Avatar billede disky Nybegynder
02. februar 2001 - 11:48 #15
du definerer ikke rsmd nogen steder, og hvad med opkobling til basen ?

Kan vi ikke lige se hele koden ?
Avatar billede glahn Nybegynder
02. februar 2001 - 11:52 #16
<%@ page import = \"java.sql.*\" %>
<%@ page import = \"java.sql.DatabaseMetaData\" %>
<%@ page import = \"java.sql.Types\" %>

<html>
<head>
<title></title>
</head>

<body>
<%
    try {
          Class.forName(\"org.gjt.mm.mysql.Driver\").newInstance();
    }
      catch (Exception E) {
          out.println(\"Unable to load driver.\");
          E.printStackTrace();
          return;    }
Connection C = null;
Statement Stmt = null;              ResultSet RS = null;
ResultSetMetaData rsmd = null;
try {
C = DriverManager.getConnection(\"jdbc:mysql://localhost/webutil\", \"root\", \"\");
RS = Stmt.executeQuery(\"SELECT * FROM rente\");
rsmd = RS.getMetaData();
}
catch (SQLException e) {
out.println(\"SQLException: \" + e.getMessage());
out.println(\"SQLState:    \" + e.getSQLState());
out.println(\"VendorError:  \" + e.getErrorCode());
return;
}
%>
<%! int numberOfColumns; %>
<%! int type; %> 
<%  numberOfColumns = 0; %>
<%
try
{
type = rsmd.getColumnType(0);
numberOfColumns = rsmd.getColumnCount();
}
catch (SQLException e) {
out.println(\"SQLException: \" + e.getMessage());
out.println(\"SQLState:    \" + e.getSQLState());
out.println(\"VendorError:  \" + e.getErrorCode());
}
%>

<%= rsmd %>
<%= numberOfColumns %>
<%
C.close();
Stmt.close();
RS.close();
%>
</body>
</html>
Avatar billede glahn Nybegynder
02. februar 2001 - 11:53 #17
Ser noget rodet ud - er noget pænere i min editor - med korrekte indryk og alt det der :o)
Avatar billede disky Nybegynder
02. februar 2001 - 11:55 #18
hmmm ser godt nok ud, hvad for en fejl for du ?
Avatar billede glahn Nybegynder
02. februar 2001 - 11:56 #19
Error: 500
Location: /examples/jsp/prototype/samling/rentedb.jsp
Internal Servlet Error:

javax.servlet.ServletException:
    at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:386)
    at jsp.prototype.samling._0002fjsp_0002fprototype_0002fsamling_0002frentedb_0002ejsprentedb_jsp_11._jspService(_0002fjsp_0002fprototype_0002fsamling_0002frentedb_0002ejsprentedb_jsp_11.java:159)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.jasper.runtime.JspServlet$JspServletWrapper.service(JspServlet.java:174)
    at org.apache.jasper.runtime.JspServlet.serviceJspFile(JspServlet.java:261)
    at org.apache.jasper.runtime.JspServlet.service(JspServlet.java, Compiled Code)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java, Compiled Code)
    at org.apache.tomcat.core.ContextManager.service(ContextManager.java:559)
    at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java, Compiled Code)
    at org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.java, Compiled Code)
    at java.lang.Thread.run(Thread.java, Compiled Code)

Root cause:
java.lang.NullPointerException:
    at jsp.prototype.samling._0002fjsp_0002fprototype_0002fsamling_0002frentedb_0002ejsprentedb_jsp_11._jspService(_0002fjsp_0002fprototype_0002fsamling_0002frentedb_0002ejsprentedb_jsp_11.java:91)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.jasper.runtime.JspServlet$JspServletWrapper.service(JspServlet.java:174)
    at org.apache.jasper.runtime.JspServlet.serviceJspFile(JspServlet.java:261)
    at org.apache.jasper.runtime.JspServlet.service(JspServlet.java, Compiled Code)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java, Compiled Code)
    at org.apache.tomcat.core.ContextManager.service(ContextManager.java:559)
    at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java, Compiled Code)
    at org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.java, Compiled Code)
    at java.lang.Thread.run(Thread.java, Compiled Code)
Avatar billede disky Nybegynder
02. februar 2001 - 12:17 #20
Sæt

Statement stmt = con.createStatement();

ind imellem

C = DriverManager.getConnection(\"jdbc:mysql://localhost/webutil\", \"root\", \"\");
RS = Stmt.executeQuery(\"SELECT * FROM rente\");

Avatar billede disky Nybegynder
02. februar 2001 - 12:20 #21
og pyt

ups skulle have været Statement Stmt = con.createStatement();


C.close();
Stmt.close();
RS.close();

ud med

RS.close();
Stmt.close();
C.Close();

altid i omvendt rækkefølge af den de bliver lavet i
Avatar billede disky Nybegynder
02. februar 2001 - 12:21 #22
doo jeg roder da rundt i det .

Byt

C.close();
Stmt.close();
RS.close();

ud med

RS.close();
Stmt.close();
C.Close();


byt

C = DriverManager.getConnection(\"jdbc:mysql://localhost/webutil\", \"root\", \"\");
RS = Stmt.executeQuery(\"SELECT * FROM rente\");

ud med

C = DriverManager.getConnection(\"jdbc:mysql://localhost/webutil\", \"root\", \"\");
Statement Stmt = con.createStatement();
RS = Stmt.executeQuery(\"SELECT * FROM rente\");
Avatar billede glahn Nybegynder
02. februar 2001 - 12:21 #23
Så skete der da noget nyt :o) Tænk at jeg kunne glemme den *gys* Nå,............. men nu kommer denne fejl :

SQLException: Column index out of range. SQLState: S1002 VendorError: 0 org.gjt.mm.mysql.jdbc2.ResultSetMetaData@88050512 0
Avatar billede disky Nybegynder
02. februar 2001 - 12:24 #24
hmmm,

hvis du fjerner
type = rsmd.getColumnType(0);
numberOfColumns = rsmd.getColumnCount();

og sæt lige type=0

virker det så ?
Avatar billede glahn Nybegynder
02. februar 2001 - 12:28 #25
Så får jeg dette :

org.gjt.mm.mysql.jdbc2.ResultSetMetaData@e01d0513 0
Avatar billede disky Nybegynder
02. februar 2001 - 12:35 #26
okay det stammer fra din <%= rsmd %>
sætning


Dette er et vildt gæt

men lav:
<%! int numberOfColumns; %>
<%! int type; %> 
<%  numberOfColumns = 0; %>
<%
try
{
type = rsmd.getColumnType(0);
numberOfColumns = rsmd.getColumnCount();
}


om til:
<%
int numberOfColumns=0;
int type=0;
numberOfColumns = 0;
try
{
  type = rsmd.getColumnType(0);
  numberOfColumns = rsmd.getColumnCount();
}


prøv evt, at fjern type=rsmd.get linien
Avatar billede glahn Nybegynder
02. februar 2001 - 12:53 #27
med type=rsmd.get....
SQLException: Column index out of range. SQLState: S1002 VendorError: 0 org.gjt.mm.mysql.jdbc2.ResultSetMetaData@42e9056d 0

uden...

org.gjt.mm.mysql.jdbc2.ResultSetMetaData@b6cd056c 5

Går ud fra at dette sidste 5-tal, er indholdet af count.
Avatar billede disky Nybegynder
02. februar 2001 - 12:54 #28
lige netop.

gad vide hvorfor den ikke kan lide getColumnType(0)

Underligt.
Avatar billede disky Nybegynder
02. februar 2001 - 12:56 #29
Hehe

der skal stå getColumnType(1)

jævnfør: (tage fra API doc)

column - the first column is 1, the second is 2, ...
Avatar billede glahn Nybegynder
02. februar 2001 - 13:08 #30
Nåhhhh ja - det er jo rigtigt (det er de små ting)

Nu får jeg så resultatet 12 for type og 5 for numberOfColumns......

Hvad betyder så 12 ????????
Avatar billede disky Nybegynder
02. februar 2001 - 13:09 #31
Avatar billede glahn Nybegynder
02. februar 2001 - 13:24 #32
Jeg fandt ud af at bruge getColumnTypeName - så siger den varchar så mangler jeg bare størrelsen på den varchar.

Men.... nu er jeg kommet så langet med din hjælp - tak - så nu burde jeg kunne komme videre selv - tror nok jeg har fattet essensen i det :o)
Avatar billede disky Nybegynder
02. februar 2001 - 13:25 #33
held og lykke.

p.s. du var ikke den eneste der lærte noget, jeg kan nemlig også bruge det i det jeg roder med privat :-)))

p.s. tak for point
Avatar billede glahn Nybegynder
02. februar 2001 - 13:45 #34
Godt man kan hjælpe hinanden - og point\'ene havde du så sandelig fortjent :o)
Avatar billede disky Nybegynder
02. februar 2001 - 13:47 #35
ja det er altid rart
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