Avatar billede madiedk Nybegynder
21. februar 2010 - 23:51 Der er 11 kommentarer og
1 løsning

Dynamisk bestemmelse af felter i sql sætning i java

Hej

Jeg koder i java og skal indlæse et 2d array i en databasetabel. Der er 30 kolonner og ca 1000 rækker. Problemet er at det er forskelligt i hvilke rækker og kolonner der er tomme felter.
Hvordan laver jeg det lettest?
der er jo sindsyg mange kombinationer, så er det muligt at lave 1 sql sætning og så der hvor der er en tom værdi tilføjer den bare en null eller tom værdi?
Avatar billede arne_v Ekspert
22. februar 2010 - 00:03 #1
En enkelt PreparedStatement med INSERT og 30 spørgsmålstegn og så setInt/setString/setXxxx for dem så har værdier og setNull for dem som ikke har værdier.
Avatar billede madiedk Nybegynder
22. februar 2010 - 00:16 #2
okay tak, har tænkt det samme. Men jeg får vel et problem ved at f.eks. række 200 er kolonne 4 tom, men for række 201 er kolonne 4 IKKE tom, men det er kolonne 7 og 23. Hvordan løses det?
Avatar billede arne_v Ekspert
22. februar 2010 - 00:18 #3
Du laver de 30 x set plus en execute for hver række, så du kan sagten ssætte dem forskelligt for forskellige rækker.
Avatar billede madiedk Nybegynder
22. februar 2010 - 00:28 #4
hmmm....forstår jeg ik rigtigt

hvis jeg nu har den her:
INSERT INTO table1 (column1, column2, column3) VALUES (?, ?, ?)

og har

stmt.setString(1, "test");
stmt.setString(2, "test1");
stmt.setString(3, "test2");

Hvis så for næste række er kolonne 3 tom, hvordan laver jeg det?
Avatar billede arne_v Ekspert
22. februar 2010 - 00:53 #5
pstmt.setString(1, "test");
pstmt.setString(2, "test1");
pstmt.setString(3, "test2");
pstmt.executeUpdate();
pstmt.setString(1, "test3");
pstmt.setString(2, "test4");
pstmt.setNull(3, Types.VARCHAR);
pstmt.executeUpdate();
...
Avatar billede arne_v Ekspert
22. februar 2010 - 00:54 #6
Normalt vil det jo nok være en løkke og ikke en sekvens.
Avatar billede arne_v Ekspert
22. februar 2010 - 01:43 #7
Snippet:

      PreparedStatement pstmt = con.prepareStatement("INSERT INTO vc VALUES(?,?)");
      for(int i = 0; i < NREC; i++) {
        pstmt.setString(1, F1VAL.substring(0, flen));
        pstmt.setString(2, F2VAL.substring(0, flen));
        pstmt.executeUpdate();
      }
      pstmt.close();
Avatar billede madiedk Nybegynder
22. februar 2010 - 12:39 #8
Okay, så jeg skal altså ind og tjekke hver række i mit 2d array om feltet er tomt eller ikke tomt og så derigennem vælge om den skal kører setstring eller setnull? Men med 30 kolonner så er der jo stadig enormt mange muligheder da det nogle gange er 17 felter der er tomme og nogle gange ingen.
Avatar billede arne_v Ekspert
22. februar 2010 - 14:55 #9
if(s7 != null) {
  pstmt.setString(7, s7);
} else {
  pstmt.setNull(7, Types.VARCHAR);
}

er en normal konstruktion.

Hvis du er heldig kan du bruge array index som parameter index.
Avatar billede arne_v Ekspert
22. februar 2010 - 14:57 #10
Ellers skal du skifte fra direkte JDBC til en ORM - de kan normalt selv finde ud af at gemme null som NULL.
Avatar billede madiedk Nybegynder
22. februar 2010 - 18:07 #11
okay, tak for svar #9 det var det jeg tænkt på, fint at få det bekræftet. smid et svar
Avatar billede arne_v Ekspert
22. februar 2010 - 19:05 #12
svar
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