/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
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("jdbcbc: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("jdbcbc: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("jdbcbc: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



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408509
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste