24. maj 2002 - 22:27Der er
35 kommentarer og 1 løsning
Java - sql kald
Jeg er (stadig) ved at lave en opgave, hvor jeg skal sammensætte et udlejningssystem. Jeg vil fra mit java program gerne lave en sql kommando, der indsætter nogle værdier i en sql database (lavet i Interbase). Java klassen hvor metoden ligger ser således ud:
public class DbBowludlej { private ResultSet results; private ResultSetMetaData rsmd; private DatabaseMetaData dma; private Connection con;
public DbBowludlej() { con = DbAdgang.getDBcon(); }
public int getMaxId(){ int id = -1; String query="SELECT MAX (BOWLUDLEJNINGSNUMMER) FROM BOWLUDLEJ"; try{ Statement stmt = con.createStatement(); results = stmt.executeQuery(query); if( results.next() ){ id = results.getInt(1); } }//slut try catch(Exception e){ System.out.println("Query exception: Fejl i indlæsning af maxId" + e); } return id; }
public int getNewId(){ int id = getMaxId(); return (id+1); }
public int insert(Object e) { Bowludlej bow = (Bowludlej) e; int rc=-1; String query="INSERT INTO Bowludlej VALUES('"+ Integer.toString(getNewId())+"',"+ bow.getBowlingBaneNummer()+","+ bow.getKundeNummer()+",'"+ bow.getTid()+"',"+ bow.getMedarbejderNummer()+","+ bow.getPeriode()+ "')";
Det går jo ud på, at udlejningsnummeret skal genereres automatisk, men det har jeg mildest talt problemer med. Lige for at klargøre det lidt mere, så ser tablet Bowludlej sådan ud i databasen:
/* Table: BOWLUDLEJ, Owner: SYSDBA */ CREATE TABLE BOWLUDLEJ (BOWLUDLEJNINGSNUMMER INTEGER NOT NULL, BOWLINGBANENUMMER INTEGER NOT NULL, KUNDENUMMER VARCHAR(8) NOT NULL, TID CHAR(11) NOT NULL, MEDARBEJDERNUMMER INTEGER NOT NULL, PERIODE INTEGER NOT NULL, CONSTRAINT BOWLUDLEJPK PRIMARY KEY (BOWLUDLEJNINGSNUMMER));
Dette er ved at være det sidste der mangler, så jeg ville virkelig sætte pris på lidt hjælp her.
Jeg har lavet en OID ( Object Identifier ) som automatisk genererer et entydigt primary key nr. du skal have en tabel dedikeret til din BOWLUDLEJ tabel .. f.eks. LedigBowlUdlejOID .. hvor inden du har oprettet noget kun er nr. 1. hvergang du så indsætter et objekt i din tabel .. så får den automatisk tildelt det næste ledige OID .. og hvis du sletter fra din tabel bliver den's OID frigivet ... og kan blive brugt igen ... hvis det er noget du er interesseret i kan jeg maile den til dig .. hvis det i det hele taget er det du mener :-)
nej .. den bliver aldrig ret stor .. hvis du sletter meget .. så bliver de frigivet .. men jeg går ud fra at du også temmelig tit sætter ind .. og derfor bliver de frigivet nr .. brugt tilsvarende som de bliver frigivet ... hmm .. der bliver kun genereret et nyt nummer når der kun er et i listen . og det bliver taget ... det er sjældent at man bare sletter og sletter og ikke sætter noget ind ??
hvis en database kan have mange tabeller med millioner af poster i hver tabel ... så kan den vel også have en tabel .. med, i værste tilfælde tabellens egen størrelse? og i bedste tilfælde 1. hvis du har en tabel med 1 mil poster .. og sletter alle poster fra 10.000 - 50.000 ... så har du en tabel med 40.000 ledige oid'er ... men i sådan et system burde det ikke være et problem ...
okay ... det er i orden at du tror den er bedre til det end jeg er .. det gør jeg sikkert også selv .. men med den instilling så sætter man jo begrænsninger på sig selv ... med alt mulig respekt disky .. men hvis du vil sætte begrænsninger på dig selv .. er okay med mig .. men lad os andre om at bestemme hvilke metoder vi vil bruge i vores programmer .. velmente råd er bestemt gode .. men nedsættende er ikke ... !!
Det er flovt det her. Jeg kan ikke finde ud af at ændre værdien fra Integer til auto_increment. Min sql bog er altså ikke videre god vil jeg lige undskylde mig med
Some databases, for example Oracle, have built in features for generating unique values that can be used for OID values. Although these approaches work well, they are by definition proprietary and therefor out of your control. If you ever have to port to a new persistence mechanism, an event that is far more common and likely than your database/persistence community is willing to admit, then this can become a serious issue for you.
fra mapping objects to relational databases by Scott W. Ambler
det var nu da jeg førsøgte mig med sætningen ALTER TABLE BOWLUDLEJ CHANGE BOWLUDLEJNINGSNUMMER BOWLUDLEJNINGSNUMMER INT(11) DEFAULT '0' NOT NULL AUTO_INCREMENT i Interbase at jeg fik fejlen
det er bestemt ikke en jeg ville vælge. Normalt bruger jeg Mysql, og til store seriøse løsninger på mit arbejde bliver det Oracle (hvis kunderne har penge nok)
disky -> personligt er jeg også selv træt af den .. men vi valgte den som projekt .. så er lidt bundet på det område .. men næste gang bliver det noget andet der skal prøves ... :-)
Ok, det kunne godt være at jeg skulle vente til efter dette projekt med at sætte mig ind i det. Du har vel ikke tilfældigvis et link til en god begynderside. Jeg kan ikke engang installere GUI'en ordentligt
jeg har selv haft samme problem... ingen increment i interbase... og har brugt denne løsning... // PRE: // POST: største idnummer findes i databasen public int findNyId() { String query = "select max(id) from kunder"; int maxId =0; try { Statement stmt = con.createStatement(); results = stmt.executeQuery(query); while(results.next()) { maxId = results.getInt(1); } } catch(Exception e) { System.out.println("Fejl i Søgning findMaxId - Dbkunder"); } return maxId +1; }
mosquito -> men med den metode vil du ikke kunne genbruge din frigivet id'er ?? du vil altid bruge max() + 1 ... så hvis du sletter .. så forsvinder de id'er bare ud i luften for aldrig at blive brugt igen ... alternativet er stadigt at man kan bruge en generator ... som følger med Interbase ... men man skal dog: create generator my_generator ... og kan tilgå den hver gang man indsætter noget i tabellen ...
Smok>> ok, men jeg er opmærksom på det, men i mit tilfælde skal det være så kunderne har mulighed for at få samme id igen senere... men databasen ændrer jo ikke størrelse.. så jeg har samtidig lavet en anden metode der sørger for at kaste en exception hvis id allerede er i brug...
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.