Avatar billede mik28 Seniormester
17. januar 2009 - 12:06 Der er 14 kommentarer og
1 løsning

flere inserts

Hej Eksperter,

Jeg har en StringBuffer som jeg fylder med inserts sådan her

sqlsb.append("insert into test(Id) values("+int_data+")");

Jeg vil så opdatere databasen således

myps = conn.prepareStatement(sqlsb.toString());

Det kan jeg ikke. Hvorfor?
Avatar billede mik28 Seniormester
17. januar 2009 - 12:09 #1
myps.executeUpdate();    myps.executeUpdate();    myps.executeUpdate();
Avatar billede mik28 Seniormester
17. januar 2009 - 12:10 #2
Avatar billede erikjacobsen Ekspert
17. januar 2009 - 12:16 #3
Om dit sql-system kan klare flere sql-sætninger i samme streng afhænger af systemet. Hvis det skulle være muligt, så skal de nok adskilles af semikolon.

Men ellers må du nøjes med at udføre een INSERT af gangen.
Avatar billede mik28 Seniormester
17. januar 2009 - 12:36 #4
Burde det her ikke være rigtigt

myps = conn.prepareStatement("insert into test(Id) values(1);insert into test(Id) values(2);");
myps.executeUpdate();
Avatar billede mik28 Seniormester
17. januar 2009 - 12:39 #5
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; insert into test(Id) values(2)' at line 1
Avatar billede mik28 Seniormester
17. januar 2009 - 12:41 #6
er jeg virkelig nød til at køre dem en af gangen :-(
Avatar billede mik28 Seniormester
17. januar 2009 - 12:45 #7
Grunden til jeg gerne vil have det på den måde er fordi jeg gerne vil validere det data som skal i databasen. Jeg læser det ind fra et excel ark. Det vil sige hvis linie 26 er "forkert" så er der intet som skal opdateres før fejlen er rettet
Avatar billede mik28 Seniormester
17. januar 2009 - 12:46 #8
Jeg har en metode til at indlæse og validere og en anden til at opdaterer databasen
Avatar billede arne_v Ekspert
17. januar 2009 - 14:24 #9
Alle JDBC drivere som jeg har prøvet blokerer for at udføre flere SQL sætninger adskilt
af semikolon og jeg tror at det er foreskrevet i JDBC standarden at det er sådan.

Så en INSERT per execute.

Brug PreparedStatement og ? for værdier.

For at sikre integritet bruger du transactions, således at enten alle eller en udføres.

(multiple sætninger adskilt af semikolon garanterer iøvrigt ikke integritet)

For speed optimering skal du kigge på andre ting. Bl.a. batch muligheden.
Avatar billede erikjacobsen Ekspert
17. januar 2009 - 14:39 #10
Læg dine SQL-sætninger i en arraylist, mens du læser fra Excel filen. Så kan du stoppe ved fejl.

"er jeg virkelig nød til at køre dem en af gangen "  -  næh, det er maskinen der gør det i en løkke af en slags. Det er ikke så galt.
Avatar billede mik28 Seniormester
17. januar 2009 - 17:38 #11
okay. Jeg skal smide dem i en arraylist og så efterfølgende køre dem en af gangen
Avatar billede arne_v Ekspert
17. januar 2009 - 20:37 #12
Der er flere aspekter.

For at indsætter flere rækker i samme tabel kan du:

lave en prepared statement
lade en løkke iterere over en ArrayList eller et array og for hver gennemløb sætter værdier og execute

Hvis du gerne vil have alt eller intet funktionalitet, så kan du slå auto commit fra
på connection og kalde enten commit eller rollback til sidst (*).

*) Med MySQL kræver det brug af InnoDB tabeller.
Avatar billede mik28 Seniormester
18. januar 2009 - 07:18 #13
Det lyder smart. Jeg vender lige tilbage når jeg er kommet frem til noget
Avatar billede mik28 Seniormester
08. juli 2010 - 16:52 #14
lukker og slukker
Avatar billede arne_v Ekspert
11. juli 2010 - 04:08 #15
Fik du ikke svar på spørgsmålet??
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