Avatar billede javanewbie11 Nybegynder
25. november 2002 - 22:27 Der er 19 kommentarer og
1 løsning

XML - Java

Jeg er kørt fast med at skulle oprette tubel i min database!
Problemet kører på at man via SAXparser og SQL strengen insert into ...., kun indsætter feks. Insert into ... Values('Hej').
Jg vil gerne kunne indsætte, med parametre feks. fra textfields i gui.
(Ligesom i PreparedStatements Insert into ... Values(?,?..)

Hvordan løser jeg dette med XML og java SAXParser?
Avatar billede arne_v Ekspert
26. november 2002 - 09:54 #1
Dit problem er, at du har dine GUI textfields i en klasse
og din SAX handler i en anden klasse.

Enten må du lave det muligt at snuppe de text-fields
fra din SAX handler.

Måske noget i retning af:

<statement SQL="INSERT INTO T VALUES(?)" field="foobar"/>

der bliver til en prepared statement og din SAX
handler kalder en getField("foobar") i din GUI klasse
og får feltet tilbage og sætter det ind.

Alternativt kan din SAX handler kalde din GUI klasse
og lave noget tilsvarende.

Eller så bør du overveje at skifte fra SAX tiL DOM.
SAX er godt for maksimal hastighed. Men DOM kan godt
give lidt mere kontrol over tingene.

Beklager det lidt vage svar. Men det er svært at
komme med en præcis løsning.
Avatar billede javanewbie11 Nybegynder
26. november 2002 - 12:53 #2
public class SAXHandler extends DefaultHandler
{
    public SAXHandler(String SQLinput)
    {
        this.SQLinput = SQLinput;
    }

    public void startElement(String namespaceURI, String localName,
        String rawName, Attributes atts) throws SAXException
    {
        con = getConnection();
     
          try
          {
            stmt = con.createStatement();


// Hvordan udfører jeg min sqlstatement i xml filen
// med SQLinput string som value?


          }
          catch ( Exception e )
          {
              e.printStackTrace();
          }
    }
}

Hvor String SQLinput er den der eksempelvis sendes fra GUI'en i form
af String a = JTextField.getText();
Avatar billede arne_v Ekspert
26. november 2002 - 13:12 #3
I denne sammenhæng er prepared statement nok
en god ide.

Altså må vi være ovre i:

<statement SQL="INSERT INTO T VALUE(?)"/>

int sqlix = atts.getIndex("SQL");
String sql = atts.getValue(sqlix));
PreparedStatment ps = con.prepareStatement(sql);
ps.setString(1, SQLinput);
ps.executeUpdate();
Avatar billede javanewbie11 Nybegynder
26. november 2002 - 13:32 #4
<?xml version = "1.0" encoding = "iso-8859-1" standalone = "yes"?>
<statements>
        <statement SQL = "INSERT INTO xmlTest VALUE(?)"/>
</statements>

Sådan ser xml-filen ud!


button1.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent event)
                {
                    try {
                        String SQLinput = jTextField1.getText();
                        SAXParserFactory spf = SAXParserFactory.newInstance();
                        spf.setValidating(false);
                        SAXParser saxParser = spf.newSAXParser();
                        XMLReader xmlReader = saxParser.getXMLReader();
                        xmlReader.setContentHandler(new SAXHandler(SQLinput));
                        xmlReader.parse("file:SQL.xml");
                        return;
                    }
                    catch ( Exception e ) {
                        e.printStackTrace();
                    }

                }
            });

Sådan ser guien ud!

Jeg fatter ikke hvorfor den kommer med flg. fejlmelding:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Argumentværdien er ugyldig.
java.sql.SQLException: [Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl i INSERT INTO-sætningen.
Avatar billede arne_v Ekspert
26. november 2002 - 13:41 #5
Det er et JDBC problem.

Kunne jeg se det udsnit af jeres SAX handler med
alle JDBC kaldene ?
Avatar billede javanewbie11 Nybegynder
26. november 2002 - 15:23 #6
public static Connection getConnection()
    {
        try
        {
            Properties props = new Properties();
            FileInputStream fs = new FileInputStream("H:\\Skole\\3.Semester\\DanBank\\DBDrivers\\intern.ini");
            props.load(fs);

              String drivers = props.getProperty("jdbc.drivers");
            if(drivers != null)
                System.setProperty("jdbc.drivers", drivers);
            String url = props.getProperty("jdbc.url");
            String username = props.getProperty("jdbc.username");
            String password = props.getProperty("jdbc.password");

            Class.forName(drivers);

            return DriverManager.getConnection(url, username, password);
        }
        catch(Exception e)
        {
            throw new RuntimeException(e.toString());
        }
    }
}

Fedtmule for at teste programmet!
Her valgte jeg bare en static metode!
Avatar billede arne_v Ekspert
26. november 2002 - 16:52 #7
Det ser jo OK ud.

Kunne du prøve at printe de 4 properties (drivers,
url, username, password) ?

Fejlen må jo være et eller andet sted !
Avatar billede javanewbie11 Nybegynder
26. november 2002 - 17:02 #8
jdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver
jdbc.url=jdbc:odbc:DANBANK
jdbc.username=
jdbc.password=
Avatar billede arne_v Ekspert
26. november 2002 - 17:06 #9
Der ser jo også rigtigt ud (forudsat at DANBANK DSN er
defineret).

Er I sikre på, at fejlen kommer fra getConnection ?
Avatar billede javanewbie11 Nybegynder
26. november 2002 - 17:12 #10
Nej tværtimod, nærmere fra ActionListeneren i gui'en!
Avatar billede arne_v Ekspert
26. november 2002 - 17:18 #11
Nu falder det mig lige i øjnene, at jeg skrev:
INSERT INTO tabelnavn VALUE (?)
lidt længere oppe.

Det skal være:
INSERT INTO tabelnavn VALUES (?)
med et S til sidst (også selvom der kun er en værdi).

Kan I ikke lige prøve om det løser problemet ?
Avatar billede javanewbie11 Nybegynder
26. november 2002 - 17:47 #12
niks
Avatar billede arne_v Ekspert
26. november 2002 - 18:56 #13
Hm. Det skal rettes alligevel.

Har I prøvet med en hardcoded value.

INSERT INTO tabelnavn VALUES('Test')

(og med ps.setString outcommented)

?

Og der er kun et felt i demn tabel - ikke ?

(ellers skal man angive navnet på det felt
man indsætter)
Avatar billede javanewbie11 Nybegynder
26. november 2002 - 19:37 #14
Efter debug er smider den SQL exception i linie *

public void startElement(String namespaceURI, String localName,
        String rawName, Attributes atts) throws SAXException
    {
        con = getConnection();
     
          try
          {
            int sqlix = atts.getIndex("SQL");
            String sql = atts.getValue(sqlix);;
                    *  ps = con.prepareStatement(sql);
                        ps.setString(1, SQLinput);
            ps.executeUpdate();

            System.out.println("Finish!");

            ps.close();
            con.close();
          }
          catch ( Exception e )
          {
              e.printStackTrace();
          }
    }
}
Avatar billede arne_v Ekspert
26. november 2002 - 19:49 #15
Og sql indeholder:
  INSERT INTO xmlTest VALUES (?)
og xmlTest indeholder kun et felt ?
Avatar billede javanewbie11 Nybegynder
27. november 2002 - 09:31 #16
Ja til begge dele
Avatar billede arne_v Ekspert
27. november 2002 - 10:51 #17
Op ad bakke hele vejen !

:-)

Har I prøvet at erstatte den prepared statmenet med
in almindelig statement med en fast værdi og se om
den virker ?
Avatar billede javanewbie11 Nybegynder
27. november 2002 - 11:14 #18
Det virker nu!
Avatar billede arne_v Ekspert
27. november 2002 - 11:36 #19
Hvad skulle der til ?
Avatar billede javanewbie11 Nybegynder
07. april 2004 - 12:40 #20
Kan jeg ikke huske nu mere!
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