|
| Java(JSP) og databaseproblem Fra : Allan Schuster Bach |
Dato : 03-04-03 13:10 |
|
Jeg har igen et problem jeg ikke forstå
Jeg har en SQL sætning
SELECT v.AnnonceID, v.Beskrivelse, v.pris, v.overskrift, v.Want, v.Stopper,
MAX(b.nypris) as maxpris
FROM TB_Anonncer v INNER JOIN TB_Priser b ON v.AnnonceID = b.Annonceid_FK
WHERE v.handel = 1
AND b.nypris >= v.pris and v.stopper > '04-04-2003'
GROUP BY v.Beskrivelse, v.pris, v.AnnonceID, v.overskrift, v.Want, v.Stopper
som virker på en MS SQL Server og retunere det forventet resultat i SQL
Query Analyzer
Dette er så lagt ind i JSP på følgende måde
//Opret et klasse navn, som kontakter databasen
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
//Skab forbindelse til databasen WSP
Connection conn = DriverManager.getConnection("jdbc bc:WSP");
//Lavet et statement, som skal udfør SQL mod databasen
Statement stmt = conn.createStatement();
//Opret et SQL statement og hent data fra databasen
String SQL = "SELECT v.AnnonceID, v.Beskrivelse, v.pris, v.overskrift,
v.Want, v.Stopper, MAX(b.nypris) as maxpris ";
SQL = SQL + "FROM TB_Anonncer v INNER JOIN TB_Priser b ON v.AnnonceID =
b.Annonceid_FK ";
SQL = SQL + "WHERE v.handel = 1 ";// + request.getParameter("valg");
SQL = SQL + "AND b.nypris >= v.pris and v.stopper > '04-04-2003' GROUP BY
v.Beskrivelse, v.pris, v.AnnonceID, v.overskrift, v.Want, v.Stopper ";
//Lav et recordset af SQL'en
ResultSet rs = stmt.executeQuery(SQL);
Men af en endnu ukendt grund kommer java med følgende
org.apache.jasper.JasperException: [Microsoft][ODBC SQL Server
Driver]Invalid Descriptor Index
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:2
48)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
snip mere stackspor
En der har et foreslag til hvad der kan være galt? Det er jo tilsyneladende
databasen der smider en fejl, men jeg kan ikke gemmenskue hvorfor
Allan Bach
| |
Allan Weber (03-04-2003)
| Kommentar Fra : Allan Weber |
Dato : 03-04-03 19:38 |
|
> //Opret et klasse navn, som kontakter databasen
> Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
> //Skab forbindelse til databasen WSP
> Connection conn = DriverManager.getConnection("jdbc bc:WSP");
Nu har jeg aldrig prøvet ar connecte til en MS SQL Database, men kun MySQL.
Umiddelbart ser det ud til, at du manger at sende et brugernavn og kodeord
med getConnection() funktionen.
Jeg bruger som regel følgende:
conn = DriverManager.getConnection(url, user_name, passwd);
Hvor de tre variable til getConnection mere eller mindre forklarer sig selv.
Endvidere bruger jeg følgende ved Class.forName kaldet:
Class.forName(DBDriver).newInstance();
Altså med newInstance(). Jeg mener dog ikke dette er strengt nødvendigt.
/Weber
| |
Allan Schuster Bach (03-04-2003)
| Kommentar Fra : Allan Schuster Bach |
Dato : 03-04-03 18:41 |
|
Jeg burde nok lige har skrevet, at det virker hvis jeg laver en "simple"
SQL, såsom
Select * from tb_annoncer where handel = 1
Så det er desværre ikke et brugerrettighedsproblem
Allan Bach
| |
Thorbjoern Ravn Ande~ (03-04-2003)
| Kommentar Fra : Thorbjoern Ravn Ande~ |
Dato : 03-04-03 19:04 |
|
"Allan Schuster Bach" <newskonto@schuster.dk> writes:
> En der har et foreslag til hvad der kan være galt? Det er jo tilsyneladende
> databasen der smider en fejl, men jeg kan ikke gemmenskue hvorfor
JDBC kan godt finde på at massere SQL inden det sendes til serveren.
Hvis du printer den SQL streng ud du gerne vil udføre, og udfører den
i et andet program der kan snakke med databasen, virker det så?
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn
| |
Allan Schuster Bach (03-04-2003)
| Kommentar Fra : Allan Schuster Bach |
Dato : 03-04-03 19:31 |
|
"Thorbjoern Ravn Andersen" <nospam0000@unixsnedkeren.dk> skrev i en
meddelelse news:kku1dfcvbf.fsf@mimer.null.dk...
> Hvis du printer den SQL streng ud du gerne vil udføre, og udfører den
> i et andet program der kan snakke med databasen, virker det så?
Jep, hvis jeg bruger MS SQL Query så virker det
Allan Bach
| |
Soren Davidsen (03-04-2003)
| Kommentar Fra : Soren Davidsen |
Dato : 03-04-03 19:17 |
|
"Allan Schuster Bach" <newskonto@schuster.dk> writes:
> Men af en endnu ukendt grund kommer java med følgende
> org.apache.jasper.JasperException: [Microsoft][ODBC SQL Server
> Driver]Invalid Descriptor Index
Ja, som du skriver er det en fejl fra databasen. Tjek hvor i din
kode du faar denne exception .. Naar du laver ny connection, eller
naar du udfoerer statement ?
Hvis du ikke faar en connection, saa tjek om dine connect parametre
er korrekte, isaer getConnection parametren. Og hvis du faar en
connection, saa proev dig frem med et simpelt query som du er sikker
paa ikke kan fejle.
'Invalid Descriptor Index' er afair en generisk besked om at der
mangler permissions, eller at ms's odbc lag ikke kan haandtere
en konvertering.
Mvh,
--
___
Soren Davidsen / o\
Math student, ICSMA (_____)
__ http://www.tanesha.net/ _________________________________(___)_______
| |
Allan Schuster Bach (03-04-2003)
| Kommentar Fra : Allan Schuster Bach |
Dato : 03-04-03 19:36 |
|
"Soren Davidsen" <soren200303@tanesha.net> skrev i en meddelelse
news:87smsz5tuw.fsf@tanesha.net...
> Ja, som du skriver er det en fejl fra databasen. Tjek hvor i din
> kode du faar denne exception .. Naar du laver ny connection, eller
> naar du udfoerer statement ?
Fejlen kommer når jeg vil udføre selver SQL. Jeg har forbindelsen til
databasen, idet at jeg godt kan udføre en
Select * from TB_Annoncer og få det forventet resultat.
> 'Invalid Descriptor Index' er afair en generisk besked om at der
> mangler permissions, eller at ms's odbc lag ikke kan haandtere
> en konvertering.
Det med ODBC lag'et under mig overhovedet ikke.
Men kan denne SQL sætning virkerlige være svær at oversætte
SELECT v.AnnonceID, v.Beskrivelse, v.pris, v.overskrift,v.Want, v.Stopper,
MAX(c.nypris) as maxpris
FROM TB_Anonncer v INNER JOIN TB_Priser c ON v.AnnonceID = c.Annonceid_FK
WHERE v.handel = 1 AND c.nypris >= v.pris and v.stopper > '04-04-2003'
GROUP BY v.Beskrivelse, v.pris, v.AnnonceID, v.overskrift,v.Want, v.Stopper
Umiddelbart er den jo ganske simple
Mit odbc lag se sådan ud
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbc bc:WSP");
Statement stmt = conn.createStatement();
Må serveren er der installeret driver for JDBC fra MS. Skulle de måske være
muligte at bruge et andet forName og i givet fald hvilket??
Allan Bach
| |
Soren Davidsen (04-04-2003)
| Kommentar Fra : Soren Davidsen |
Dato : 04-04-03 07:13 |
|
"Allan Schuster Bach" <newskonto@schuster.dk> writes:
[snip]
> Må serveren er der installeret driver for JDBC fra MS. Skulle de måske være
> muligte at bruge et andet forName og i givet fald hvilket??
Ja, det vil nok vaere en god ide at goere det. Hvordan ser dine tabeller
ellers ud, de 'konverterings fejl' ved odbc, er somregel ved text og
blobs og andre lignende 'mystiske' typer.
com.microsoft.jdbc.sqlserver.SQLServerDriver er deres driver-klasse og
jdbc:microsoft:sqlserver://server1:1433;User=test;Password=secret
er et eksempel paa en url til at faa en connection fra .. mener jeg .
Mvh,
--
___
Soren Davidsen / o\
Math student, ICSMA (_____)
__ http://www.tanesha.net/ _________________________________(___)_______
| |
Allan Schuster Bach (03-04-2003)
| Kommentar Fra : Allan Schuster Bach |
Dato : 03-04-03 21:06 |
|
Nu har jeg fået lokaliseret problemet, så nu er spørgsmålet bare, hvordan
jeg få det løst?
Min sql ser sådan ud:
SELECT v.*, MAX(c.nypris) as maxpris
FROM TB_Anonncer v INNER JOIN TB_Priser c ON v.AnnonceID = c.Annonceid_FK
WHERE v.handel = 1
and v.stopper > '04-04-2003' GROUP BY v.Beskrivelse, v.pris, v.AnnonceID,
v.overskrift,v.Want, v.Stopper,v.bruger,v.handel
Jeg få så et recordsset tilbage som indeholder alle felter fra TB_Annoncer
og et maxpris. Men af en eller anden årsag så kan jeg ikke bare skrive
<%= rs.getString("maxpris")%>, for så er det at fejlen opstå
Jeg kan derimod godt skrive <%= rs.getString("pris")%> men det er ikke den
jeg vil have fat i
org.apache.jasper.JasperException: [Microsoft][ODBC SQL Server
Driver]Invalid Descriptor Index
hvordan få jeg så fat på den række?
Allan Bach
| |
M_abs (05-04-2003)
| Kommentar Fra : M_abs |
Dato : 05-04-03 20:33 |
|
> Nu har jeg fået lokaliseret problemet, så nu er spørgsmålet bare, hvordan
> jeg få det løst?
> Min sql ser sådan ud:
> SELECT v.*, MAX(c.nypris) as maxpris
> FROM TB_Anonncer v INNER JOIN TB_Priser c ON v.AnnonceID = c.Annonceid_FK
> WHERE v.handel = 1
> and v.stopper > '04-04-2003' GROUP BY v.Beskrivelse, v.pris, v.AnnonceID,
> v.overskrift,v.Want, v.Stopper,v.bruger,v.handel
> Jeg få så et recordsset tilbage som indeholder alle felter fra TB_Annoncer
> og et maxpris. Men af en eller anden årsag så kan jeg ikke bare skrive
> <%= rs.getString("maxpris")%>, for så er det at fejlen opstå
> Jeg kan derimod godt skrive <%= rs.getString("pris")%> men det er ikke
den
prøv med <%= rs.getInt("maxpris")%> eller <%= rs.getDouble("maxpris")%> ,
jeg kan ved ikke om MS SQL er helt ligeglad med datatypen.
Ellers så prøv med denne lille løkke for at finde ud af hvad rækkenr maxpris
er, samtidlig får du alle rækkenavne
(i alm. java du må selv lave den til JSP)
for (int i = 0; rs.i<getRows(); i++)
{
System.out.println(rs.getString(i) + " rækkenr " + i );
}
mvh Morten
PS.: jeg har ikke testet koden
| |
M_abs (06-04-2003)
| Kommentar Fra : M_abs |
Dato : 06-04-03 10:56 |
|
"M_abs" <M_abs@oncable.dk> skrev i en meddelelse
news:3e8f2f71$0$31975$edfadb0f@dread12.news.tele.dk...
>
> > Nu har jeg fået lokaliseret problemet, så nu er spørgsmålet bare,
hvordan
> > jeg få det løst?
> > Min sql ser sådan ud:
> > SELECT v.*, MAX(c.nypris) as maxpris
> > FROM TB_Anonncer v INNER JOIN TB_Priser c ON v.AnnonceID =
c.Annonceid_FK
> > WHERE v.handel = 1
> > and v.stopper > '04-04-2003' GROUP BY v.Beskrivelse, v.pris,
v.AnnonceID,
> > v.overskrift,v.Want, v.Stopper,v.bruger,v.handel
> > Jeg få så et recordsset tilbage som indeholder alle felter fra
TB_Annoncer
> > og et maxpris. Men af en eller anden årsag så kan jeg ikke bare skrive
> > <%= rs.getString("maxpris")%>, for så er det at fejlen opstå
> > Jeg kan derimod godt skrive <%= rs.getString("pris")%> men det er ikke
> den
>
> prøv med <%= rs.getInt("maxpris")%> eller <%= rs.getDouble("maxpris")%>
,
> jeg kan ved ikke om MS SQL er helt ligeglad med datatypen.
> Ellers så prøv med denne lille løkke for at finde ud af hvad rækkenr
maxpris
> er, samtidlig får du alle rækkenavne
>
> (i alm. java du må selv lave den til JSP)
>
> for (int i = 0; rs.i<getRows(); i++)
> {
> System.out.println(rs.getString(i) + " rækkenr " + i );
> }
skal selvfølgelig være
for (int i = 0; i < rs.getRows(); i++)
{
System.out.println(rs.getString(i) + " rækkenr " + i );
}
ups
| |
Søren Berg Glasius (07-04-2003)
| Kommentar Fra : Søren Berg Glasius |
Dato : 07-04-03 07:53 |
|
> skal selvfølgelig være
>
> for (int i = 0; i < rs.getRows(); i++)
> {
> System.out.println(rs.getString(i) + " rækkenr " + i );
> }
>
en lille indskydelse:
kollonnenummerering i jdbc starter (af en eller anden grund) fra nr. 1, så
den helt korrekte løkke må være:
for (int i = 1; i <= rs.getRows(); i++) {
System.out.println(rs.getString(i) + " rækkenr " + i );
}
MVH
Søren
| |
M_abs (08-04-2003)
| Kommentar Fra : M_abs |
Dato : 08-04-03 13:51 |
|
"Søren Berg Glasius" <spamfree@privat-post.dk> skrev i en meddelelse
news:b6r77i$v15$1@news.cybercity.dk...
> > skal selvfølgelig være
> >
> > for (int i = 0; i < rs.getRows(); i++)
> > {
> > System.out.println(rs.getString(i) + " rækkenr " + i );
> > }
> >
> en lille indskydelse:
> kollonnenummerering i jdbc starter (af en eller anden grund) fra nr. 1, så
> den helt korrekte løkke må være:
>
> for (int i = 1; i <= rs.getRows(); i++) {
> System.out.println(rs.getString(i) + " rækkenr " + i );
> }
Nåja selvfølgelig
| |
|
|