Avatar billede rasmuslh Nybegynder
18. maj 2005 - 16:24 Der er 10 kommentarer og
1 løsning

Escape tegn i et Insert-statement.

Hejsa

Jeg prøver at indsætte nogle tegn i en kolonne hvor der nogle gange indgår et '. Så vidt jeg kan se er det muligt at escape alle tegn i en string ved at sætte hele sekvensen i {}.

EX: '{Rasmus' hund's moster}'

Da strengen er automatisk genereret ved jeg ikke hvor ' kommer henne i stringen og kan derfor ikke selv indsætte et \.

Kan nogen hjælpe med måde som escaper hele den string som er givet som value?

Mvh.
Rasmus

PS: Arbejder på Oracle version 10.*
Avatar billede arne_v Ekspert
18. maj 2005 - 17:06 #1
Det bedste er vel at bruge prepared statements / parameters fordi så
behøver du slet ikke gøre noget.

Hvis dit programmerings sprog / database API ikke understøtter det, kan
du så ikke lave en replace i din strenge fra "'" til "''" (fra en til to
single quotes).
Avatar billede rasmuslh Nybegynder
18. maj 2005 - 17:16 #2
Hvad mener du med at man ikke behøver at gøre noget med et prepared statement?

Jeg bygger min sql sådan her:

queryInsert="INSERT INTO "+localName+" VALUES( "+counter+", '"+car+"', +internCounter;
for(int i=0; i<attributes.getLength();i++){
      queryInsert +=", '"+ attributes.getValue(i)+"'";

Det er variablen car der er et problem.

QueryInsert bliver executed på et almindeligt statement.

statementInsert.execute(queryInsert);
Avatar billede arne_v Ekspert
18. maj 2005 - 17:22 #3
PreparedStatement pstmt = con.prepareStatement("INSERT INTO " + localName + " VALUES(?,?,?)");
pstmt.setInt(1,counter);
pstmt.setString(2,car);
pstmt.setInt(3,interCounter);
pstmt.executeUpdate();
Avatar billede arne_v Ekspert
18. maj 2005 - 17:22 #4
og så sørger den venlige JDBC driver for at håndtere single quotes i car
Avatar billede rasmuslh Nybegynder
18. maj 2005 - 17:22 #5
Nu har jeg kigget lidt på prepared statement og kan godt se at man undgår det ved at bruge den.

Problemet er nu at man skal bruge en conncetion-pool for at lave en forbindelse og vi ville meget gerne undgå at lave alverden om i vores db-connection.
Avatar billede rasmuslh Nybegynder
18. maj 2005 - 17:24 #6
Ja, kan godt se at det er noget smartere sådan sm du skriver det op der! :D

Prepared stament har en lidt dårligere performance ikke? Ikke at det gør så meget. Det er mere af nysgerrighed jeg spørger.
Avatar billede arne_v Ekspert
18. maj 2005 - 17:28 #7
PreparedStatement skal bruge en Connection - men om den kommer fra en
connection pool eller ej er lige meget
Avatar billede arne_v Ekspert
18. maj 2005 - 17:30 #8
Og performance kan faktisk være bedre.

Forklaring - i mange tilfælde kan man lave

PreparedStatement pstmt = con.prepareStatement("INSERT INTO " + localName + " VALUES(?,?,?)");

en gang og så kalde

pstmt.setInt(1,counter);
pstmt.setString(2,car);
pstmt.setInt(3,interCounter);
pstmt.executeUpdate();

mange gange med forskellige værdier.

På nogle databaser kan det give en pæn performance forbedring !
Avatar billede rasmuslh Nybegynder
18. maj 2005 - 17:34 #9
Problemet var da vi brugte et PreparedStaement fik vi en overload fejl hvorefter vi søgte på den fejl og fik at vide at man enten skulle lukke sin connection eller lave en connection pool. Derfor opgav vi at bruge den.

Jeg prøver at implementere det med PreparedStatement så jeg kan få fejlen igen. Eller endnu bedre få det til at virke. :D
Avatar billede rasmuslh Nybegynder
18. maj 2005 - 18:03 #10
Hej Arne

Fik det til at virke. Fik en 'Open cursor overload', men løste det ved at lukke forbindelsen og lave en ny regelmæssigt.

Læg et svar som tak for hjælpen.

Mvh.
Rasmus
Avatar billede arne_v Ekspert
18. maj 2005 - 18:39 #11
kommer her
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
Computerworld tilbyder specialiserede kurser i database-management

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