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

SAXParse

Mangler en stump kode hvor man fra en .XML (hvori der er erklæret SQL statements) for fat i disse og execute dem?
Avatar billede arne_v Ekspert
25. november 2002 - 18:03 #1
For SAX delen måske noget i retning af:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<statements>
    <statement SQL="SELECT * FROM T1"/>
    <statement SQL="SELECT * FROM T2"/>
</statements>

import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class MySax extends DefaultHandler {
  public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException {
      for(int i = 0; i < atts.getLength(); i++) {
        System.out.println("executing: " + atts.getValue(i));
      }
      return;
  }
}

import javax.xml.parsers.*;
import org.xml.sax.*;

public class SaxSql {
  public static void main(String[] args) throws Exception {
      SAXParserFactory spf = SAXParserFactory.newInstance();
      spf.setValidating(false);
      SAXParser saxParser = spf.newSAXParser();
      XMLReader xmlReader = saxParser.getXMLReader();
      xmlReader.setContentHandler(new MySax());
      xmlReader.parse("file:SaxSql.xml");
      return;
  }
}
Avatar billede arne_v Ekspert
25. november 2002 - 18:04 #2
Hvis I kigger lidt i de sidste ugers svar vil I finde
masser af database/SQL/JDBC eksempler !
Avatar billede javanewbie11 Nybegynder
25. november 2002 - 18:59 #3
Jeg tænker med connection og statement skal de executes mod db'en!
Avatar billede arne_v Ekspert
25. november 2002 - 19:08 #4
Ja.

Se f.eks.:
  http://www.eksperten.dk/spm/287482

I putter så executeUpdate ind i jeres SAX handler.

(jeg tror ikke at executeQuery passer ind i SAX
sammenhæng)
Avatar billede carstenknudsen Nybegynder
25. november 2002 - 19:25 #5
Det ville hjælpe gevaldigt hvis du viste os et eksempel
på hvordan en sådan xml fil kunne se ud, der er stor forskel
på hvordan du behandler det hvis der står statements direkte,
i modsætning til en form for xml kodning som i:
<select selection="*">
<from>tabelnavn</from>
<where>navn<like>'%sen'</like></where>
</select>
eller hvad ved jeg. I så fald skal handleren
være noget mere detaljeret end i eksemplet ovenfor.
Avatar billede javanewbie11 Nybegynder
25. november 2002 - 19:48 #6
Jeg er en smule ny i xml
....
<statements>
  <create>
      <statement SQL = "Create Table test (name (2))/>
  </create>
</statements>

noget i den stil
Avatar billede carstenknudsen Nybegynder
25. november 2002 - 19:49 #7
arne_v: nu vi er i det hjørne hvor ingen
overflødig beregning skal laves så skal:
for(int i = 0; i < atts.getLength(); i++)
altid være
for(int i = 0, n = atts.getLength(); i < n; i++)
:)
Avatar billede carstenknudsen Nybegynder
25. november 2002 - 19:51 #8
jamen så skal du have en lidt udvidet version af
arne_v's kode, den skal du nok få snart.
Avatar billede arne_v Ekspert
25. november 2002 - 20:23 #9
Måske noget i retning af:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<statements>
  <create>
    <statement SQL="CREATE TABLE T1"/>
    <statement SQL="CREATE TABLE T2"/>
  </create>
  <insert>
    <statement SQL="INSERT INTO T1"/>
    <statement SQL="INSERT INTO T2"/>
  </insert>
</statements>

import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class MySax extends DefaultHandler {
  private final static int CREATE = 1;
  private final static int INSERT = 2;
  private int mode = 0;
  public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException {
      if(rawName.equals("create")) mode = CREATE;
      if(rawName.equals("insert")) mode = INSERT;
      for(int i = 0; i < atts.getLength(); i++) {
        switch(mode) {
            case CREATE:
                System.out.println("create statement: " + atts.getValue(i));
                break;
            case INSERT:
                System.out.println("insert statement: " + atts.getValue(i));
                break;
            default:
                break;
        }
      }
      return;
  }
}
Avatar billede arne_v Ekspert
25. november 2002 - 20:26 #10
To noter:
  * at SQL kommandoen både er i tag navn og attribut value
    er redundant
  * min SAX parser er ikke særligt køn
Avatar billede arne_v Ekspert
25. november 2002 - 20:32 #11
carsten: din konstruktion er ikke særligt køn og
er faktisk langsommere i de tilfælde hvor det
gennemsnitlige antal attributter per tag er
tæt på 0. Så jeg køber den ikke.
Avatar billede carstenknudsen Nybegynder
25. november 2002 - 20:36 #12
arne_v: du behøver ikke at købe den; den er
bedre selv om du ikke køber den. Den er også
en generel måde at beregne en invariant på,
der iøvrigt har så lokalt scope som muligt.
PS jeg synes ikke (jeg gentager: ikke) at man
skal lave den hurtigste løsning for enhver pris,
vedligeholdelse og læsbarhed er helt centrale.
Hvis kun hastighed betød noget kodede vi ikke Java:)
Avatar billede arne_v Ekspert
25. november 2002 - 20:44 #13
Følgende er lidt kønnere:

import org.xml.sax.helpers.*;

public class MySax extends DefaultHandler {
  private final static int CREATE = 1;
  private final static int INSERT = 2;
  private int mode = 0;
  public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException {
      if(rawName.equals("create")) mode = CREATE;
      if(rawName.equals("insert")) mode = INSERT;
      int sqlix = atts.getIndex("SQL");
      if(sqlix >= 0) {
        switch(mode) {
            case CREATE:
              System.out.println("create statement: " + atts.getValue(sqlix));
              break;
            case INSERT:
              System.out.println("insert statement: " + atts.getValue(sqlix));
              break;
            default:
              break;
        }
      }
      return;
  }
}
Avatar billede javanewbie11 Nybegynder
25. november 2002 - 21:34 #14
Jeg mangler bare det jeg spurgte om i starten med execution af disse SQL string inde i Java.

I form af Statement
Avatar billede javanewbie11 Nybegynder
25. november 2002 - 21:46 #15
Jeg takker!
Du får velfortjent dine 60 points!
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