13. april 2004 - 11:59Der er
18 kommentarer og 1 løsning
Java og access databse
Jeg sidder og roder med noget database tingang men kan ikke få det til at virke. Hvis jeg bare skulle lave en simpel gui med en main klasse, der kunne hive noget data ud af en database (f.eks.) kundenavne i en kundedatase, hvordan kunne det så se ud. Jeg bruger som sagt en access database.
Prøv nedenstående, det er kastet sammen med en skovl, ville dog mene at det virkede. Om ikke andet, kan det måske bringe dig videre, eller foranledige spørgsmål.
import java.sql.*; public class DBaccess extends javax.swing.JFrame {
public DBaccess() { initComponents(); setSize(650, 550); }
jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jTextField2 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); jEditorPane1 = new javax.swing.JEditorPane(); jButton2 = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel(); jTextField3 = new javax.swing.JTextField(); jScrollPane1 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); jLabel5 = new javax.swing.JLabel();
ResultSetMetaData data = rs.getMetaData(); int columns = data.getColumnCount(); rs.last(); int rows = rs.getRow(); rs.first(); StringBuffer buf = new StringBuffer();
buf.append("Result from query\n\n");
for(int x =0; x < rows; x++){ for(int i =0; i < columns; i++){ buf.append(rs.getObject(i).toString() + "\t"); } buf.append("\n"); }
Arne V: Jeg har fået lavet gui og har kigget på en masse eksempler på forbindelse mellem java og access, men kan ikke rigtig finde hoved og hale i det. Det jeg har er en main klasse der starter gui'en. I guien kan brugeren skrive et kundenavn, hvorefter alle ordre lavet af denne kunde skulle kunne vises i textarea eller ligende. Det jeg ikke kan få til at virke er at få databasen til at retunere noget ud fra den select sætning jeg har genereret. Kort og godt.--> Bruger indtaster kundernavn og trykker på "søg" knap ---> en select sætning bliver genereret ud fra det indtastede ---> select sætningen bliver sendt til databasen, men den sender ikke noget igen.:-(
Carsten: Pyyha...tak skal du ha, jeg skal lige se om jeg kan finde hoved og hale i det:-)
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:DinDSN"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM dintabel WHERE kunde='" + kundeTextBox.getText()+"'"); while(rs.next()) { int ifelt = rs.getInt(1); // kolonne 1 er en integer String sfelt = rs.getString(2); // kolonne 2 er en string // vis ifelt og sfelt på en eller anden måde i GUI }
oki det lader til at jeg har fået forbindelse, men den vil ikke retunere noget. Den bliver ved med at skrive følgende fejl besked.?!?!?!?
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Invalid character value for cast specification on column number 1 (kundenavn) at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958) at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115) at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(JdbcOdbc.java:3812) at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(JdbcOdbcResultSet.java:5642) at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(JdbcOdbcResultSet.java:585) at G2Gui.actionPerformed(G2Gui.java:139) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786) at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245) at java.awt.Component.processMouseEvent(Component.java:5100) at java.awt.Component.processEvent(Component.java:4897) at java.awt.Container.processEvent(Container.java:1569) at java.awt.Component.dispatchEventImpl(Component.java:3615) at java.awt.Container.dispatchEventImpl(Container.java:1627) at java.awt.Component.dispatchEvent(Component.java:3477) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128) at java.awt.Container.dispatchEventImpl(Container.java:1613) at java.awt.Window.dispatchEventImpl(Window.java:1606) at java.awt.Component.dispatchEvent(Component.java:3477) at java.awt.EventQueue.dispatchEvent(EventQueue.java:456) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137) at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
Nu ved jeg godt at der er lagt svar, men jeg har lige en lille ting til. Hvis nu jeg gerne vil samle alle mine database forespørgsler i en database-tilgangs klasse, hvor der er forskellige metoder til forskellige forespørgsler hvordan får jeg så metoden til at retunere svarene fra databasen til gui-klassen? Hvis du ellers forstår hvad jeg mener:-)
hmm...nu er jeg ikke overhovedet bekendt med beans. Jeg har også hørt noget om at man kunne bruge noget der hedder vectorer... er det muligt i denne situation?
:-( Jeg kan simpelthen ikke få det til at virke.. Er du ikke en guttermand og smide en simpelt eksempel ud, på hvordan det kunne se ud.:-) Som sagt så virker det fint fra min actionlistner metode, men jeg vi gerne ha det samlet i en database klasse.
public class SimpleDBGUI extends JFrame implements ActionListener { private JButton find; private JTextField crit; private JTextArea res; private DBHandler db; public SimpleDBGUI() { getContentPane().setLayout(new BorderLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 400); crit = new JTextField(); getContentPane().add(crit, BorderLayout.NORTH); res = new JTextArea(); getContentPane().add(res, BorderLayout.CENTER); find = new JButton("Søg"); find.addActionListener(this); getContentPane().add(find, BorderLayout.SOUTH); db = new DBHandler("TestMSAccess", "Admin", ""); } public void actionPerformed(ActionEvent evt) { res.setText(""); ArrayList lst = db.getAll(crit.getText()); for(int i = 0; i < lst.size(); i++) { res.setText(res.getText() + lst.get(i) + "\r\n"); } } public static void main(String[] args) { SimpleDBGUI f = new SimpleDBGUI(); f.show(); } }
class DBHandler { private Connection con; private Statement stmt; public DBHandler(String dsn, String usr, String pwd) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:" + dsn, usr, pwd); stmt = con.createStatement(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public ArrayList getAll(String crit) { ArrayList res = new ArrayList(); try { ResultSet rs = stmt.executeQuery("SELECT * FROM t1 WHERE f2 LIKE '" + crit + "'"); while (rs.next()) { res.add(new Record(rs.getInt(1), rs.getString(2))); } rs.close(); } catch (SQLException e) { e.printStackTrace(); } return res; } }
class Record { private int f1; private String f2; public Record() { f1 = 0; f2 = ""; } public Record(int f1, String f2) { this.f1 = f1; this.f2 = f2; } public int getF1() { return f1; } public String getF2() { return f2; } public void setF1(int f1) { this.f1 = f1; } public void setF2(String f2) { this.f2 = f2; } public String toString() { return (f1 + " " + f2); } }
Synes godt om
Ny brugerNybegynder
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.