webForumDet fria alternativet

Mata in variabel i databas

Java

15 svar · 417 visningar · startad av Web-Tor

Medlem sedan nov. 200013 890 inlägg
Frågan#1
statement.executeUpdate("INSERT INTO tblBook (colDate, colName, colText) VALUES (1, 2, 3)");

Ovanstående funkar fint men hur gör jag när jag ska ha in variabler i databasen?

En sådan här t.ex:

request.getParameter("fltName")

Man ska väl använda +-tecken på nåt sätt men jag fattar inte hur?

Medlem sedan aug. 20021 752 inlägg
#2

Det finns 2 sätt.
Antingen det "lätta"

int tmp=request.getParameter("fltName");
statement.executeUpdate("INSERT INTO tblBook (colDate, colName, colText) VALUES ("+request.getParameter("fltName")+", "+tmp+", 3)");

Tänk dock på att int inte får vara null (eftersom det är en primitiv datatyp, inget objekt) så du måste vara säker på att det finns data i "fltName".

Ett annat och mycket snyggare sätt är att använda "PreparedStatement". Detta sätt är också mycket efektivare om du måste göra många liknande insert/update, du gör ett preparedstatement och jobbar sedan mot det för alla update/insert.

int tmp1=request.getParameter("fltName1");
int tmp2=request.getParameter("fltName2");
int tmp3=request.getParameter("fltName3");

PreparedStatement s = conn.prepareStatement("INSERT INTO tblBook (colDate, colName, colText) VALUES (?, ?,?)");
s.setInt(1,tmp1);
s.setInt(2,tmp2);
s.setInt(3,tmp3);
s.executeUpdate();

För mer info om PreparedStatment titta här, PreparedStatment

/Viktor

Medlem sedan nov. 200013 890 inlägg
#3

Tack, jag märker att jag måste börja hålla reda på vilken datatyp informationen har (det slipper man ju med PHP).

Jag ändrade koden för att det skulle passa in på min sida. Ser det bra ut?

String tmp1=request.getParameter("fltName");
String tmp2=request.getParameter("fltMail");
String tmp3=request.getParameter("fltText");

PreparedStatement s = con.prepareStatement("INSERT INTO tblBook (colName, colMail, colText) VALUES (?,?,?)");
s.setString(1,tmp1);
s.setString(2,tmp2);
s.setString(3,tmp3);
s.executeUpdate();
Medlem sedan aug. 20021 752 inlägg
#4

Japp, det ser bra ut :)
När du kör en preparedstatement så behöver du inte heller oroa dig för vad ska ha för fnuttar och typ runt datum och strängar, det fixar preparedstatement till.

/Viktor

Medlem sedan nov. 200013 890 inlägg
#5

Jag gillade det här med preparedStatement. Kan man använda det även när man söker i databasen?

String givenName = request.getParameter("fltGivenName");

ResultSet rs = statement.executeQuery("SELECT colID FROM tblUsers WHERE colGivenName LIKE '%" + givenName + "%' ORDER BY colSurName");
Medlem sedan mars 20007 896 inlägg
#6

Jäpp:

PreparedStatement preparedStatement = connection.prepareStatement( "SELECT * FROM blah WHERE blih = ?" );

preparedStatement.setString( 1, "bloh" );

ResultSet resultSet = preparedStatement.executeQuery();

Om det var det du menade?

Medlem sedan nov. 200013 890 inlägg
#7

Ja!
Det funkar ju fint men hur gör jag om jag vill ha in %-tecknena också:

String givenName = request.getParameter("fltGivenName");
PreparedStatement s = con.prepareStatement("SELECT colID FROM tblUsers WHERE colGivenName LIKE ?");
s.setString(1,givenName);
ResultSet rs = s.executeQuery();
Medlem sedan mars 20007 896 inlägg
#8
...WHERE colGivenName LIKE %?%

Skulle jag gissa på.

Medlem sedan aug. 20021 752 inlägg
#9

Då får du lägga till dem själv

PreparedStatement s = con.prepareStatement("SELECT colID FROM tblUsers WHERE colGivenName LIKE ?");
s.setString(1,"%"+givenName+"%");

PreparedStatement är nog bäst att använda vid insert/update.

/Viktor

Medlem sedan nov. 200013 890 inlägg
#10

PreparedStatement är nog bäst att använda vid insert/update.

Varför det?
Jag tycker att det funkar kanon nu när jag ska söka på en massa olika fält.
Man får liksom bättre struktur på koden. :)

Medlem sedan mars 20007 896 inlägg
#11

Fast prestandaökningen sker vid användning av INSERT, DELETE och UPDATE-frågor. Däremot tror jag knappast att det är någon prestandaförlust att använda det vid en SELECT-fråga, så gillar du det bör du använda det. :)

Medlem sedan aug. 20021 752 inlägg
#12

Jag tycker själv inte att det blir bra/snyggt/rent när man kör så som jag skrev (om SPiN's kod fungerar så ser det ju bättre ut) och när du har en Select så är det sällan du ställer flera likadan eftervarandra som du gör med update och insert, det är när du gör det som ett PreparedStatement har en fördel när det gäller prestanda.

och spin är 1 min före igen :x

/Viktor

Medlem sedan nov. 200013 890 inlägg
#13

Jag håller med om att SPiNs syntax såg trevligare ut men den verkar inte funka:

Syntaxfel i frågeuttrycket 'colGivenName LIKE %Pa_RaM000%'.

Fan vet vad Pa_RaM000 är, men det känns inte bra. :l

Medlem sedan aug. 20021 752 inlägg
#14

Fungerar perfekt för mig :)

PreparedStatement s =conn.prepareStatement("select * from members where username like ?");
s.setString(1,"%vikt%");
ResultSet rs=s.executeQuery();

Fick ut 1 medlem som heter Viktor.

/Viktor

Medlem sedan nov. 200013 890 inlägg
#15

Jo, din kod funkar Viktor. Det var SPiNs kod som inte funka. ;)

Medlem sedan aug. 20021 752 inlägg
#16

ok, trode du inte kunde få någon kod att fungera

/Viktor

258 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)