Avatar billede halfblind Nybegynder
21. april 2001 - 22:11 Der er 17 kommentarer og
1 løsning

java-sql

i access har jeg lavet en Kunde-tabel og en af søjlerne har jeg kaldet Navn.
hvordan kan jeg lave at når brugeren indtaster kundenavnet at man tjekker inde i access om navnet findes og så sende resultatet til programmet, som så udfører det det skal hvis navnet findes/ikke findes i databasen?
Avatar billede perla Nybegynder
21. april 2001 - 23:02 #1
    strSQL = \"Select * from Tabel where Navn =\'\" & Request(\"firmanavn\") & \"\'\"
    set RS = conn.execute( strSQL )
    if rs.eof Then
      \'Findes ingen
    Else
      \' Finde
    End If
Avatar billede halfblind Nybegynder
21. april 2001 - 23:13 #2
men hvordan får jeg svaret tilbage til main?
Avatar billede perla Nybegynder
21. april 2001 - 23:15 #3
Er ikke helt med. Eksemplet som jeg viser foregår på en asp side.
Avatar billede halfblind Nybegynder
21. april 2001 - 23:18 #4
det er java jeg arbejder med. jeg kan godt lave en statement som finder navnet, ved bare ikke hvordan jeg behandler svaret uden at få en exception, hvis navnet ikke findes.
Avatar billede agermose Nybegynder
22. april 2001 - 10:31 #5
Statement stm = connection.createStatement();
ResultSet s = stm.executeQuery(\"select ...\");
while (s.next()) {
  System.err.println(s.getString(\"column\");
}
Avatar billede disky Nybegynder
23. april 2001 - 08:52 #6
perla: hvorfor poste asp i en JAVA gruppe ?
Avatar billede disky Nybegynder
23. april 2001 - 08:58 #7
halfblind:

Det kan du ikke.

Hvis du f.eks. forsøger at tilgå en kolonne som ikke findes i basen får du en fejl.

Men man må selvfølgelig gå ud fra at du kender din database, så kig på følgende, som er taget direkte fra en jsp/beans løsning jeg er ved at lave:
            if(!db.open()) //er der en connection til databasen ?
            {
                return;
            }
            res=db.doQuery(\"select * from plantbase where \"+sql.toString()); //lav forespørgsel
            db.close(); //luk forbindelse
      try
        {
            if( (res!=null) && (res.next())) //er der et resultat
            {
                setName(res.getString(\"name\"));
                setPlantid(res.getString(\"kode\"));
                return true;
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace(System.out);
        }
        return false;


Grunden til jeg laver en \'if( (res!=null) && (res.next())) \' istedet for det agermose gør, skyldes at hvis du ikke først checker på om res!=null, og forsøger at lave en res.next() så får du en nullPointerException

Avatar billede agermose Nybegynder
23. april 2001 - 11:06 #8
Her til vil jeg sige to ting. Den ene er ikke personligt rettet mod nogen som har skrevet indlæg til dette spørgsmål!

Jeg mener man skal illustrere problemløsningen, men lade spørgeren arbejde med de sidste detaljer i det omfang det er rimeligt at antage at vedkommende kan det.
F.eks. her: Det kan ikke passe at jeg også skal demonstrere hvordan man loader en JDBC driver, eller laver en try-cache statement. Det blev der ikke spurgt om, enten fordi vedkommende godt ved det, ellers må man også gå ud fra at vedkommende formår selv at undersøge den sammenhæng mit svar skal indsættes i.
Jeg vil gerne sige igen - det er ikke specielt rettet imod nogen her, men mere en generel opfattelse af hvordan nogen spørger/svarer her på experten.

Ang. disky\'s svar. Ja det er mere komplet i den forstand, at der er en try-catch statement omkring. Og det er mere rigtigt end det jeg har svaret. Der imod er det forkert at undersøge om res!=null. Der returneres ALDRIG null. Hvis det skulle ske, er det fordi der er en fejl, og der bliver således kastet en SQLException!

Andre kommentarer til koden kunne være:

1) Der bør altid kun være et return sted i en metode
2) man laver ikke en select * når man bruger to navngivne koloner
3) stack trace fra skal på system.err
4) du kan ikke lukke forbindelsen til databasen inden du henter resultsettets enkelte rækker (?)
5) det er mildt sagt misvisende at svare med kode der ikke er std. java, som foreksempel db.doQuery
Avatar billede disky Nybegynder
23. april 2001 - 11:18 #9
agermose:

han spørger i sin 3. posting om man kan undgå at handle exceptions, det kan man ikke derfor viser jeg hvordan man gør.

Den med resultset!=null har du ret i.

1. nix, koden bliver unødvendig besværlig og brug af flag, man kan ligeså godt forlade en metode når en fejl er opstået, eller opgaven er løst. Men dette er religion ikke programmering

2. jo det gør man for i den database jeg bruger er der 14 kolonner som jeg alle sammen skal bruge, men i dettet eksempel fjernede jeg de 12 af res.getxxx()

3. betyder ikke noget, da Resin automatisk smider det i Error.log. Men ellers enig

4. Jo det kan man udemærket godt. Hele resultatet af søgningen er gemt i Resulset variablen, og derfor er der ikke længere brug for connection.

5. nå du skriver ellers selv lige at folk skal tænke selv. Og læg mærke til jeg skriver at eksemplet er taget fra en helhed, så det passer jo perfekt med det du siger at man skal illustrere problemløsningen. Og forresten skal du ikke bestemme hvordan jeg svarer på folks spørgsmål.

Hvis folk beder om en løsning, får de en løsning, hvis de vil have en ledetråd for de en ledetråd.

Der er ikke noget mere irriterende en folk der ikke vil/kan svare på et spørgsmål med det samme, men hellere snakker udenom.
Avatar billede agermose Nybegynder
23. april 2001 - 11:47 #10
lad smag være smag :-)

Men, hvis din db er en connection (og det er den sikkert ikke), så kan du ikke kalde close på den og derefter læse fra resultset\'et. Resultset\'et skal ikke læses ind før det bruges.
Avatar billede disky Nybegynder
23. april 2001 - 12:11 #11
db er en klasse som styrer database forbindelsen osv.

Det kan godt være du synes det er sådanne, men det virker som det skal, resultsættet jeg får retur indeholder alle resultater fra søgningen som den skal.
Avatar billede agermose Nybegynder
23. april 2001 - 12:43 #12
JDBC er en række foreskrifter for hvordan det som min. skal være, bla. fordi der ikke er mange databaser der implementere helt de samme funktioner m.m. og heller ikke helt med samme semantik.
Hvis du sider med en database der gør hvad du regner med, og du kan/vil udnytte det, så OK. Men det er lidt farligt (?) at skrive om en funktion der går sådan og sådan, hvis det ikke er en generelt understøttet funktionalitet. Som udgangspunkt skal man regne med at connection.close() lukker og ryder alle database resourcer der er alokeret.
Det sker f.eks. på Interbase og Sybase.
Avatar billede disky Nybegynder
23. april 2001 - 13:12 #13
tja, men mig bekendt er det ikke defineret nogen steder at en resultset skal ødelægges hvis connection lukkes.
Faktisk er det jo dumt at holde den åben, indtil alle data er hentet, det spiller resourcer og tager længere tid.
Avatar billede agermose Nybegynder
23. april 2001 - 13:21 #14
jeg kender ikke den præcise definition på \"at dealokere alle resourcer forbundet med en connection\". Normalt er det der imod ret dumt at lukke en connection, men derimod genbruge den - typisk i connection pools. Det er \"dyrt\" at oprette forbindelser. Man har vel oftes brug for at hente alle de resultater man spørger efter, men normalt vil jeg mene at man henter det man faktisk bruger. Der kan siges meget for og imod både det ene og det andet valg, og jeg tror ikke det giver mening at starte en storm på dette. Jeg er bare overbevist om at man ikke kan tillade sig at gå ud fra andet end at man henter når man spørger, og kun en række ad gangen.
Avatar billede disky Nybegynder
23. april 2001 - 13:31 #15
det med pool\'s kan jeg kun være helt enige i.Men grunden til det virker kan vel også have noget at gøre med Garbage Collection.

Du kan jo ikke dealokere noget i java, du kan sætte en reference =null; men det fortæller jo bare til garbage collectoren at denne reference ikke bruges mere, men da jeg stadigvæk har fat i et ResultSet kan den se at den stadigvæk er i brug og fjerner den derfor ikke.

Men det er dog et gæt.

Men jeg vil lige kigge lidt mere på det, for hvis det ikke virker på Sybase og lign. må jeg jo hellere rette det.

Avatar billede agermose Nybegynder
23. april 2001 - 13:41 #16
jeg tror \"deallokere\" i hovedsagen referere til databasens allokering af resource. Database manageren allokere en del resoucer til at holde styr på åbne cursor\'s og bruger informationer osv. Session information. Jeg mener connection.close er et tegn til databasen om at disse kan lukkes. Det er også derfor der \"bør\" kastes en exeption når man så læser på et resultset. Og det sker f.eks. i Interbase med

interbase.interclient.InvalidOperationException: [interclient] Invalid operation on a closed result set.

men implementation er åbenbart ret forskellige.
Avatar billede halfblind Nybegynder
23. april 2001 - 20:07 #17
ok...nu er jeg mere forvirret end jeg var i starten. jsp/beans kender jeg slet ikke, det får vi først på næste semester. jeg har et program med gui hvor mankan oprette kunder, og slette kunder. Det fungerer fint, og det jeg vil er hvis en som ikke kender min database, vil oprette en kunde som allerede findes i databasen, at der vises en JOptionPaneMessageDialog, hvor der står at kunden allerede er opretten, eller hvis man vil slette en kunde som faktisk ikke findes i databasen, atjeg kan skrive at den ikke findes. Og jeg kan ikke finde ud af hvordan jeg kan lave det
Avatar billede agermose Nybegynder
23. april 2001 - 22:07 #18
så dit problem er at du vil undersøge om noget findes i databasen?

int count = 0;
ResultSet set = stm.executeQuery(\"select count(*) from ... where navn = \'bla\'\");
if ((count = set.getInt(1)) == 0)
  System.err.println(\"findes ikke\");
else
  System.err.println(\"mindst en\");

Hvis du skal bruge navnene i forbindelse med en dialogbox, så kan du jo lae en alm. select som anført tidligere, og tælle antal gange du ryger gennem while løkken.

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