Avatar billede mercutio Nybegynder
12. maj 2002 - 17:59 Der er 11 kommentarer og
1 løsning

Min forespørgsmel bliver kørt to gange...

Jeg kalder denne bean..

import java.sql.*;
import java.net.*;
import java.io.*;
import java.util.*;

/*
parametere til open metoden er:
"org.gjt.mm.mysql.Driver","jdbc:mysql://localhost/DatabaseNavn","username","password"
*/

public class dbHandler extends Object
{
   
    private Connection con=null;

    /** Creates new DataBase */
    public dbHandler()
    {
    }

    public boolean open(String dbDriverName, String dbClassName, String user, String pass)
    {           
        try
        {
            if(con==null)
            {
                Class.forName(dbDriverName).newInstance();
                con = DriverManager.getConnection(dbClassName, user, pass);
                System.out.println("con = "+con);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (InstantiationException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        return true;
    }
   
    public void close()
    {
        if(con!=null)
        {
            try
            {
                con.close();
                con=null;
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
            }
        }
    }
   
    public int doUpdate(String sql)
    {
        if(con!=null)
        {
            try
            {
                long time=System.currentTimeMillis();
                Statement stat=con.createStatement();
                System.out.println("SQL Update = "+(System.currentTimeMillis()-time)+" ms  "+sql);
                return stat.executeUpdate(sql);       
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
            }
        }
        return 0;
    }

    public ResultSet doQuery(String sql)
    {
        if(con!=null)
        {
            try
            {
                long time=System.currentTimeMillis();
                Statement stat=con.createStatement();
                System.out.println("SQL Update = "+(System.currentTimeMillis()-time)+" ms  "+sql);
                return stat.executeQuery(sql);       
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
            }
        }
        return null;
    }
}

Med den JSP kode.

<%@ page import='java.sql.*, javax.sql.*, javax.naming.*' %>
<%@ page language=javascript %>
<% var title='Counter' %>
<html>
<head>
<title><%= title %></title>
</head>
<body bgcolor='white'>
<jsp:useBean id='dbhandler' class='dbHandler' scope='application'/>
<h1><%= title %></h1>
<%  dbhandler.open("org.gjt.mm.mysql.Driver","jdbc:mysql://localhost/kodebank","root","");
    dbhandler.doUpdate("Create table faq(id int not null, question varchar(100) not null, anser varchar(222) null)");
    dbhandler.close();
%>

<% out.println("hejsa"); %>!
</body></html>

og får denne fejl.

SQL Update = 0 ms  Create table faq(id int not null, question varchar(100) not n
ull, anser varchar(222) null)
con = org.gjt.mm.mysql.jdbc2.Connection@19762f
SQL Update = 0 ms  Create table faq(id int not null, question varchar(100) not n
ull, anser varchar(222) null)
java.sql.SQLException: General error: Table 'faq' already exists

Selv om jeg kun kører jsp siden en gang.... nogen forklaringer?
Avatar billede lbhansen Nybegynder
12. maj 2002 - 20:11 #1
hejsan.
Umiddelbart, så ville jeg starte med at erklære din dbHandler med et request scope istedet, da den ikke er threadsafe.

er du sikker på at du ikke har glemt at droppe tabellen før du kalder den igen en anden gang?
Avatar billede mercutio Nybegynder
12. maj 2002 - 20:13 #2
jeps har dobbelt testet....
Avatar billede lbhansen Nybegynder
12. maj 2002 - 20:16 #3
så ville jeg nok også bruge en <%@ page language="java"%> istedet, da det er den eneste der er defineret i jsp 1.2 spec., som er garanteret på alle applikations serverer, der overholder denne spec.
Avatar billede disky Nybegynder
12. maj 2002 - 20:20 #4
denne her giver ingen mening i en JSP side:
<%@ page language=javascript %>


Forresten hvis din tabel findes i forvejen skal SQL databasen komme med den fejl.

send en 'drop table faq' til din inden din create.
Avatar billede mercutio Nybegynder
12. maj 2002 - 20:22 #5
jeg har fjernet det der javascript noget.... Havde kopieret noget af jsp siden fra en tutorial og det røg lige med...
Avatar billede mercutio Nybegynder
12. maj 2002 - 20:30 #6
Så ud fra koden burde det ikke ske?
Avatar billede =maddog= Nybegynder
13. maj 2002 - 00:19 #7
hvis du har lavet et table kaldet faq en gang vil jeg formode at du skal lave et drop table faq før du kan oprette en tabel vad samme navn igen. (som disky har pointeret). du kan med fordel samle alle dine catch, idet alle undtagelser arver fra Exception
catch (Exception e) {
  e.printStackTrace(System.out);
  return false;
}
Avatar billede =maddog= Nybegynder
13. maj 2002 - 00:21 #8
vent lidt. jeg læste ikke ordentligt. hvordan laver du et drop table når det ikke virker?
Avatar billede disky Nybegynder
13. maj 2002 - 10:47 #9
maddog:

Du må meget undskylde men dit forslag om at samle alle exception med en 'catch (Exception e)' er ret dumt.

Hvorfor tror du at der findes arvinger til Exception ?

Men fanger ALDRIG kun Exception, man fanger specifikt dem man ved kan komme, da man jo ikke skal gøre det samme med en SQLException som hvis det var en NullPointerException !

Det eneste sted det kan accepteres at fange Exception er i ens main() simpelthen for at sikre at alle exceptions bliver fanget. Og dette endda kun i en debug udgave af ens programmer, ikke i final release, for der har man selvfølgelig fanget alle exceptions inden.
Avatar billede =maddog= Nybegynder
13. maj 2002 - 11:08 #10
det er skam bare disse her jeg taler om
        catch (SQLException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (InstantiationException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace(System.out);
            return false;
        }
der alle håndteres ens. i øvrigt ville jeg lade metoden kaste undtagelserne og håndtere dem andetsteds, f.x. i en errorpage hvis det er JSP.
Jeg kan se at det jeg skrev før kan misforstås som at alle Exceptions i hele metoden skulle gribes som Exception. Det er bestemt ikke hensigtsmæssigt.
Avatar billede disky Nybegynder
13. maj 2002 - 13:50 #11
den måde han har gjort det på er den korrekte måde at gøre det på (det er mig der har lavet det kode han bruger)

Grunden til de laver det samme alle exceptions, skyldes at det er en udviklingsudgave han anvender, i mine færdige produkter, sker der forskellige ting i de forskellige catch'es.

p.s. Man bruger ikke en errorpage, man håndterer fejlene inden.

Der er ikke noget der er mere irriterende for en bruger end en errorpage, det bevidser nemlig udviklerne ikke havde styr på tingene.
Avatar billede =maddog= Nybegynder
13. maj 2002 - 15:33 #12
jamen det er jeg ikke uenig i.
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