max.ID

Status
Niet open voor verdere reacties.

Warranty

Gebruiker
Lid geworden
3 nov 2006
Berichten
100
Een klein vraagje (weer).

Ik heb deze code:

Code:
                Statement Patientlezen = conn.createStatement();
                ResultSet rs = Patientlezen.executeQuery(
                        "SELECT * FROM max.Patient");

                    Statement ttoevoegen = conn.createStatement();
                    ttoevoegen.executeUpdate(
                            "INSERT INTO Adres (adresnr, adres, huisnr, postcode, woonplaats) VALUES ('" + rs + "','" +
                            padres + "','" + phuisnr + "','" + ppostcode +
                            "','" + pwoonplaats + "')");

Met de sql code max.Patient wil ik het maximale nummer, het hoogste nr dus, uit een tabel halen met een autonummering record. Om deze als variabele verder te gebruiker in een bepaald scherm. Ik heb toch het gevoel dat ik iets fout doe omdat het niet werkt. Zouden jullie mij kunnen helpen?
 
dit kan je veel beter oplossen met een andere SQL statement. Met een select * vraag je aan de database alle records terwijl je met de volgende statement 1 record vraagt en ook nog maar 1 veld ipv allemaal

SELECT max(<plaats hier de naam van het autonummeringsveld>) FROM Patient

bijvoorbeeld
SELECT max(ID) FROM Patient

----
Overigens wanneer je een autonummeringsveld hebt kan je het veld ook weg laten uit je insert query. Je database zorgt immers voor de automatische nummering.
 
Laatst bewerkt:
Aaah, ik denk niet dat je me helemaal snapt. Ik wil de gegevens uit een autonummering veld halen van een vorig scherm, om in dit scherm te gebruiken. Dank voor je hulp in ieder geval. Ik ga het even proberen :thumb:
 
Code:
                String padres = txtfPadres.getText();
                String phuisnr = txtfPhuisnr.getText();
                String ppostcode = txtfPpostcode.getText();
                String pwoonplaats = txtfPwoonplaats.getText();

                try {

                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
                    Connection conn = DriverManager.getConnection(
                            "jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=c:/Erusmus.mdb;");

                Statement Patientlezen = conn.createStatement();
                ResultSet rs = Patientlezen.executeQuery(
                        "SELECT max(Patientnr) FROM Patient");

                    Statement ttoevoegen = conn.createStatement();
                    ttoevoegen.executeUpdate(
                            "INSERT INTO Adres (adresnr, adres, huisnr, postcode, woonplaats) VALUES ('" + rs + "','" +
                            padres + "','" + phuisnr + "','" + ppostcode +
                            "','" + pwoonplaats + "')");

Dit is even mijn hele stukje code. Ik haal dus het maximale nummer uit een autonummering veld van een database, om deze te gebruiken om een nieuw veld ook in te voeren met ditzelfde getal, zodat ze in de database aan elkaar gelinkt zijn via een relatie.

De rest, (adres huisnr postcode woonplaats) kan je zelf invullen. Alleen het adresnr word ingevuld met behulp van het maximale nummer uit een ander veld.

Alleen werk het op deze manier nog niet. Zie jij wat ik fout doe?
 
Laatst bewerkt:
Ik zie het ja, mijn fout. Ok in dat geval is het inderdaad handig om zo je max uit de tabel te halen. De reden dat het niet werkt is omdat je in je insert statement niet een getal (integer) meegeeft, maar een ResultSet.

De java API zegt dit over een ResultSet:
http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html

In andere woorden je krijgt zoiets:

Code:
ResultSet rs = Patientlezen.executeQuery(
                        "SELECT max(Patientnr) FROM Patient");

[B]int maxPatientnr = rs.getInt(0);[/B]

                    Statement ttoevoegen = conn.createStatement();
                    ttoevoegen.executeUpdate(
                            "INSERT INTO Adres (adresnr, adres, huisnr, postcode, woonplaats) VALUES ('" + maxPatientnr + "','" +
                            padres + "','" + phuisnr + "','" + ppostcode +
                            "','" + pwoonplaats + "')");
Eerst halen we uit een ResultSet het getal wat op de eerste regel eerste veld staat en daarna kan je dit getal gebruiken in je insert statement. Al heb je bij getallen weer geen ' ' nodig maar dat is een ander verhaal.
 
Nu geeft hij echt telkens de melding: java.sql.SQLException: [Microsoft][ODBC-stuurprogrammabeheer] Ongeldige descriptorindex

Ik heb zelf ook al een aantal dingen geprobeerd maar ik zou niet weten wat ik fout doe. Ik ga nog even verder met proberen maar als jij snapt wat ik fout doe hoor ik het graag. Ik heb jou bovenstaande code iig gewoon direct geprobeert zoals hij is. Nu heb ik dit:

Code:
                String padres = txtfPadres.getText();
                String phuisnr = txtfPhuisnr.getText();
                String ppostcode = txtfPpostcode.getText();
                String pwoonplaats = txtfPwoonplaats.getText();

                try {

                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
                    Connection conn = DriverManager.getConnection(
                            "jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=c:/Erusmus.mdb;");

                Statement Patientlezen = conn.createStatement();
                ResultSet rs = Patientlezen.executeQuery(
                                        "SELECT max(Patientnr) FROM Patient");
                
                int maxPatientnr = rs.getInt(0);
                
                                    Statement ttoevoegen = conn.createStatement();
                                    ttoevoegen.executeUpdate(
                                            "INSERT INTO Adres (adresnr, adres, huisnr, postcode, woonplaats) VALUES ('" + maxPatientnr + "','" +
                                            padres + "','" + phuisnr + "','" + ppostcode +
                            "','" + pwoonplaats + "')");
 
als je alle errors catcht, print dan even een stacktrace. Zo kan je zien waar die fout gaat.

catch (Exception e) {
e.printStackTrace();
}
uit mn hoofd
 
Code:
    class btnVerderHandler implements ActionListener
    {
        public void actionPerformed( ActionEvent e )
        {

            boolean checkOk = true;
            String fouttekst = "";
            if (txtfPadres.getText().length() == 0) {
                checkOk = false;
                fouttekst += "\n Adres is niet ingevuld!";
            }
            if (txtfPhuisnr.getText().length() == 0) {
                checkOk = false;
                fouttekst += "\n Huisnr is niet ingevuld!";
            }
            if (txtfPpostcode.getText().length() == 0) {
                checkOk = false;
                fouttekst += "\n Postcode is niet ingevuld!";
            }
            if (txtfPwoonplaats.getText().length() == 0) {
                checkOk = false;
                fouttekst += "\n Woonplaats is niet ingevuld!";
            }
            if (!checkOk) {
                JOptionPane.showMessageDialog(null, fouttekst, "Iets vergeten?",
                                          JOptionPane.ERROR_MESSAGE);
            }
            else {


                String padres = txtfPadres.getText();
                String phuisnr = txtfPhuisnr.getText();
                String ppostcode = txtfPpostcode.getText();
                String pwoonplaats = txtfPwoonplaats.getText();

                try {

                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
                    Connection conn = DriverManager.getConnection(
                            "jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=c:/Erusmus.mdb;");

                Statement Patientlezen = conn.createStatement();
                ResultSet rs = Patientlezen.executeQuery(
                                        "SELECT max(Patientnr) FROM Patient");

                String maxPatientnr = rs.getString("adresnr");

                                    Statement ttoevoegen = conn.createStatement();
                                    ttoevoegen.executeUpdate(
                                            "INSERT INTO Adres (adresnr, adres, huisnr, postcode, woonplaats) VALUES ('" + maxPatientnr + "','" +
                                            padres + "','" + phuisnr + "','" + ppostcode +
                            "','" + pwoonplaats + "')");

//Extra
                    System.out.println("Connected To Access");
                    conn.close();
//Extra

                }

                catch (SQLException se) {
                    System.out.println(se);
                }

                catch (Exception ex) {
                    System.out.println(ex);
                }

Ik heb nu dit maar het werkt nog steeds niet. Ziet iemand wat er fout aan is?

Het gaat mij om het stukje max.Patientnr. Dat werkt nog niet helemaal goed. De error zegt Column not found. Maar er is gewoon een column adresnr waarin hij dus de maxpatientnr in zou moeten voeren automatisch.

Misschien selecteert hij dat max. patientnr nu wel want hij geeft daar geen foutmelding over. Ook heb ik er een string van gemaakt terwijl het eigenlijk een int is. Kan dat kwaad en zou ik het beter een int kunnen maken?
 
Laatst bewerkt:
ResultSet rs = Patientlezen.executeQuery("SELECT max(Patientnr) FROM Patient");
String maxPatientnr = rs.getString("adresnr");

Wat je in de eerste regel doet is een query maken waarin er 1 kolom is. Deze kolom neemt het maximum van de waarde Patientnr aan. Er is in deze query geen adresnr! De tabel kan het misschien wel hebben, maar je noemt het niet in je query!

String maxPatientnr = rs.getString(0);
zal wel werken omdat je hier gewoon de eerste kolom pakt.

Wanneer je het adresnr zoekt van waar Patientnr het hoogst is, moet je je query aanpassen.
 
Code:
                try {

                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
                    Connection conn = DriverManager.getConnection(
                            "jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=c:/Erusmus.mdb;");

                Statement Patientlezen = conn.createStatement();
                ResultSet rs = Patientlezen.executeQuery(
                                        "SELECT max(Patientnr) FROM Patient");

                String maxPatientnr = rs.getString("Patientnr");

                                    Statement ttoevoegen = conn.createStatement();
                                    ttoevoegen.executeUpdate(
                                            "INSERT INTO Adres (adresnr, adres, huisnr, postcode, woonplaats) VALUES ('" + maxPatientnr + "','" +
                                            padres + "','" + phuisnr + "','" + ppostcode +
                            "','" + pwoonplaats + "')");

Kan het zo ook? Alhoewel dit nog steeds niet werkt. Hij zegt "Column not found" op deze manier. Op de manier die jij aangaf met String maxPatientnr = rs.getString(0); geeft hij de foutmelding "Ongeldige descriptorindex". Ik zoek me rot maar kan niks vinden.
 
probeer eens een 1 ipv een 0, weet niet precies waar hij begint met tellen. Wat je ook kan doen is in je query een naam opgeven en deze uitlezen:

SELECT max(Patientnr) AS Nummer FROM Patient

Nu kan je de kolom Nummer uitlezen
 
Maar hij leest de kolom Patientnr al uit, want er staat SELECT max(>>>>Patientnr<<<<) FROM Patient. Maar hij pakt hem niet voor een of andere rare rede..
 
Laatst bewerkt:
Nee hij pakt uit die kolom het hoogste nummer, dat is iets anders als het tonen van dat tuple. Wanneer je een select query uitvoert dan kan je het aantal tuples (lees een bepaalde rij met gegevens uit je database) beperken door er bepaalde condities aan te hangen (je WHERE clause). De function die je gebruikt is niet een onderdeel van je where clause, dus je moet helemaal het gedachtengoed van de tuple loslaten.

De function grijpt uit alle tuples (want je zet geen where) uit de kolom patientnr het hoogste nummer. Dit is per definitie iets anders dan het tonen van de kolom patientnr en daar de tuple met het hoogste nummer.

Grijp voor de grap eens naar een database/query programma. Al pak je access, dan zal je zien dat wanneer je de query uitvoert dat de kolomnaam iets als Exp100 zal zijn en niet Patientnr. Daarom heb je de "AS" functie nodig om een naam te geven aan de nieuw geintroduceerde kolom.

Zie ook
http://www.w3schools.com/sql/sql_functions.asp
 
Ik kom er echt niet uit maar ik heb het nu gewoon zo:

Code:
                Statement Patientlezen = conn.createStatement();
                ResultSet rs = Patientlezen.executeQuery(
                        "SELECT * FROM Patient");

En gek genoeg pakt hij dan ook gewoon het hoogste nr. Het max patientnr dus. Ook al heb gewoon aangegeven dat hij alle gegevens van de tabel Patient moet uitlezen, en daarna "een" patientnr moet uitkiezen, pakt hij automatisch het maximale. Maar als het op deze manier wel werkt, en niet met SELECT (max)Patientnr FROM Patient dan ligt het toch aan dit stukje SQL code. Neem ik aan?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan