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?
Annonceindlæg fra Computerworld
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.
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();
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();
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.
26. november 2002 - 13:41
#5
Det er et JDBC problem. Kunne jeg se det udsnit af jeres SAX handler med alle JDBC kaldene ?
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!
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 !
26. november 2002 - 17:02
#8
jdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver jdbc.url=jdbc:odbc:DANBANK jdbc.username= jdbc.password=
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 ?
26. november 2002 - 17:12
#10
Nej tværtimod, nærmere fra ActionListeneren i gui'en!
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 ?
26. november 2002 - 17:47
#12
niks
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)
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(); } } }
26. november 2002 - 19:49
#15
Og sql indeholder: INSERT INTO xmlTest VALUES (?) og xmlTest indeholder kun et felt ?
27. november 2002 - 09:31
#16
Ja til begge dele
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 ?
27. november 2002 - 11:14
#18
Det virker nu!
27. november 2002 - 11:36
#19
Hvad skulle der til ?
07. april 2004 - 12:40
#20
Kan jeg ikke huske nu mere!
Kurser inden for grundlæggende programmering