21. april 2001 - 22:11Der 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?
strSQL = \"Select * from Tabel where Navn =\'\" & Request(\"firmanavn\") & \"\'\" set RS = conn.execute( strSQL ) if rs.eof Then \'Findes ingen Else \' Finde End If
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.
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
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
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.