Avatar billede christian_catu Nybegynder
24. maj 2002 - 22:27 Der 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:

import java.sql.*;
import java.net.URL;
import java.util.*;

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()+ "')";

      try{
              Statement stmt = con.createStatement();
              rc = stmt.executeUpdate(query);
       
          }   
          catch(Exception ex){
              System.out.println("Insert exception i db: "+ex);
          }
      return(rc);
    }
}

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.
Avatar billede disky Nybegynder
24. maj 2002 - 22:31 #1
du skal rette i din database så dit udlejningsnummer er 'AUTO_INCREMENT' så laver databasen automatisk et unikt nummer for dig :)
Avatar billede smok Nybegynder
24. maj 2002 - 22:38 #2
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 :-)

smok
Avatar billede smok Nybegynder
24. maj 2002 - 22:42 #3
ups .. det var en OID klasse ... (java)
Avatar billede disky Nybegynder
24. maj 2002 - 22:45 #4
smok:
Den er ret farlig at bruge, hvis du har en database med millioner af poster, og sletter ofte, så bliver din liste over fri ID's MEGET stor.

udnyt SQL istedet.
Avatar billede smok Nybegynder
24. maj 2002 - 22:49 #5
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 ??
Avatar billede disky Nybegynder
24. maj 2002 - 22:52 #6
det er farligt at lave den slags forudsætninger,

Hvis du bruger en 'long' som id, så tæller du bare derud af istedet.

en long er MEGET stor.
Avatar billede christian_catu Nybegynder
24. maj 2002 - 22:54 #7
smok>> Det er faktisk ikke meningen at der skal slettes noget, når først den kører, så jeg vil da meget gerne se den du har lavet.

disky>> Hvis jeg opretter den som Auto_Increment i sql, hvordan skal metoden så se ud i Javafilen?
Avatar billede christian_catu Nybegynder
24. maj 2002 - 22:55 #8
smok>> Bare send den til catu@worldwidenerds.dk
Avatar billede smok Nybegynder
24. maj 2002 - 22:57 #9
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 ...
Avatar billede disky Nybegynder
24. maj 2002 - 23:00 #10
smok.
nævn en god grund til ikke at bruge auto_increment. Tro mig den er bedre til det end du er.


christian:
Et autoincrement felt skal du bare ikke indsætte når du laver en insert, det gør databasen helt af sig selv.

byt din getNewID() ud med ''
så ordner den det selv.
Avatar billede smok Nybegynder
24. maj 2002 - 23:07 #11
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 ... !!
Avatar billede christian_catu Nybegynder
24. maj 2002 - 23:09 #12
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
Avatar billede smok Nybegynder
24. maj 2002 - 23:14 #13
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
Avatar billede disky Nybegynder
24. maj 2002 - 23:18 #14
denne her kan bruges Christian:

ALTER TABLE BOWLUDLEJ CHANGE BOWLUDLEJNINGSNUMMER BOWLUDLEJNINGSNUMMER INT(11) DEFAULT '0' NOT NULL AUTO_INCREMENT
Avatar billede christian_catu Nybegynder
24. maj 2002 - 23:21 #15
Så får jeg sådan en fætter:
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 1, char 22
-CHANGE
Avatar billede disky Nybegynder
24. maj 2002 - 23:25 #16
ret din insert query til:
String query="INSERT INTO Bowludlej VALUES('',"+
                                      bow.getBowlingBaneNummer()+","+
                                    bow.getKundeNummer()+",'"+               
                                    bow.getTid()+"',"+
                                bow.getMedarbejderNummer()+","+
                                    bow.getPeriode()+ "')";
Avatar billede christian_catu Nybegynder
24. maj 2002 - 23:28 #17
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
Avatar billede smok Nybegynder
24. maj 2002 - 23:28 #18
Jeg mener ikke at auto_increment eksisterer i Interbase .. du skal nok have fat i en generator ... hvis du vil følge disky's råd .. så kan du kigge her: http://bepp.8m.com/english/database_modeling/generating_unique_value.htm
Avatar billede disky Nybegynder
24. maj 2002 - 23:30 #19
damm, det vidste jeg ikke.

Ups så er smok's løsning fornuftig alligevel.

Eller den med max()+1

Damm jeg troede interbase var en nogenlunde fornuftig database.
Avatar billede smok Nybegynder
24. maj 2002 - 23:32 #20
hmm ... det er okay disky ... nu ved du at Interbase ikke er en fornuftig database ... ;-)
Avatar billede disky Nybegynder
24. maj 2002 - 23:33 #21
hehe.

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)
Avatar billede smok Nybegynder
24. maj 2002 - 23:34 #22
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 ... :-)
Avatar billede smok Nybegynder
24. maj 2002 - 23:43 #23
http://www.mers.com/faqinterbase.html

Denne er måske mere gennemført ... håber du finder ud af det
Avatar billede christian_catu Nybegynder
24. maj 2002 - 23:44 #24
Jeg er så træt af Interbase. Hvilket program kan du anbefale at anvende i stedet for disky?
Avatar billede disky Nybegynder
24. maj 2002 - 23:49 #25
Til skole projekter og næsten alle prof. projekter ville jeg vælge Mysql, den er hurtig gratis og fed at arbejde med.

Til helt prof. ting har den dog lidt mangler.
Avatar billede christian_catu Nybegynder
25. maj 2002 - 00:24 #26
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
Avatar billede disky Nybegynder
25. maj 2002 - 00:34 #27
installere hvad ?
Avatar billede mosquito Nybegynder
25. maj 2002 - 02:13 #28
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;
    }
Avatar billede smok Nybegynder
25. maj 2002 - 09:53 #29
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 ...
Avatar billede christian_catu Nybegynder
25. maj 2002 - 11:56 #30
Disky>> Installere GUI'en. Jeg skal vel bruge en gui, til at bruge programmet
Avatar billede disky Nybegynder
25. maj 2002 - 12:11 #31
smok:
Hvis du bruger en int(11) har du flere milliarder ID's du kan bruger.

Så i 99.99% af alle databaser er det rigeligt.



christian:
Til mysql er der ingen GUI, om der er til interbase aner jeg ikke.
Avatar billede christian_catu Nybegynder
25. maj 2002 - 13:12 #32
disky>> ok, jeg fandt bare en gui på mysql.com. Jeg regnede med man skulle indtaste statements i den
Avatar billede disky Nybegynder
25. maj 2002 - 13:19 #33
det kan man sikkert jeg gør det altid i commandprompten :-)
Avatar billede christian_catu Nybegynder
25. maj 2002 - 13:34 #34
disky>> Jeg skal starte serveren ved at skrive "mysqld-nt --standalone" i commandprompt ikke? Der sker mnemlig ikke noget
Avatar billede disky Nybegynder
25. maj 2002 - 13:36 #35
jo det mener jeg.

det er længe siden jeg har kørt mysql på en windows maskine.

men det står fint forklare i manualen
Avatar billede mosquito Nybegynder
27. maj 2002 - 10:14 #36
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...
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