/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Insert i DB
Fra : John Sarby


Dato : 28-07-09 19:58

Hej.
Er der en der kan gennemskue mit problem.
bem = filmtitel + "," + ""&rsxx("Uddato")&"" + "," +
""&rsxx("Udtid")&"" + "," + ""&rsxx("Inddato")&"" + "," +
""&rsxx("Indtid")&"" + ","

SQLU = "UPDATE Kunder set bem=" & bem & " where id=" & rs("id")
&""
set rsu = Connection.Execute(SQLU)
Jeg får en fejlmeddelse, at der er fejl ved IN - desværre hedder
filmen
Fejlmeddelse:
Microsoft OLE DB Provider for SQL Server error '80040e14'
Incorrect syntax near the keyword 'IN'.
xlejecheck.asp, line 78

IN THE VALLEY OF ELAH
Hvad skal jeg gøre og hvad har jeg gjort forkert.
Feltet er sat som NVARCHAR(MAX) og titlen på filmen er også sat
til NVARCHAR(50)
På forhånd tak.
MVH
John



--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Leif Neland (28-07-2009)
Kommentar
Fra : Leif Neland


Dato : 28-07-09 22:19

John Sarby skrev:
> Hej.
> Er der en der kan gennemskue mit problem.
> bem = filmtitel + "," + ""&rsxx("Uddato")&"" + "," +
> ""&rsxx("Udtid")&"" + "," + ""&rsxx("Inddato")&"" + "," +
> ""&rsxx("Indtid")&"" + ","
>
> SQLU = "UPDATE Kunder set bem=" & bem & " where id=" & rs("id")
> &""
> set rsu = Connection.Execute(SQLU)
> Jeg får en fejlmeddelse, at der er fejl ved IN - desværre hedder
> filmen
> Fejlmeddelse:
> Microsoft OLE DB Provider for SQL Server error '80040e14'
> Incorrect syntax near the keyword 'IN'.
> xlejecheck.asp, line 78
>
> IN THE VALLEY OF ELAH
> Hvad skal jeg gøre og hvad har jeg gjort forkert.
> Feltet er sat som NVARCHAR(MAX) og titlen på filmen er også sat
> til NVARCHAR(50)
> På forhånd tak.
> MVH
> John

Det, der altid er det første skridt er "response.write sqlu"

Så vil du se at sqlu er
UPDATE Kunder set bem=IN THE VALLEY OF ELAH

Du mangler quotes.

Men det rigtige er jo at lave et parameterized query.

Dette ser faktisk interessant ud:
http://codesnippets.joyent.com/posts/show/498
Her defineres funktionen execute_query

Så kan det laves med

execute_query(conn, "UPDATE Kunder set bem=? where id=?",
array(bem,rs("id"))

Leif

Stig Johansen (29-07-2009)
Kommentar
Fra : Stig Johansen


Dato : 29-07-09 09:32

Leif Neland wrote:

> Men det rigtige er jo at lave et parameterized query.

Enig.

> Dette ser faktisk interessant ud:
> http://codesnippets.joyent.com/posts/show/498
> Her defineres funktionen execute_query

Men umiddelbart ser det ud som funktionen udelukkende er lavet til SELECT
'ting'.

Hvis det var mig, ville jeg nok udvide funktionen til at returnere
'rowsaffected', i tilfælde af, det ikke var en SELECT man fyrede af.

Og når vi snakker UPDATE(eller INSERTR osv.), så er det nok en god idé at
destroye commandobjectet inden man forlader funktionen.

--
Med venlig hilsen
Stig Johansen

Leif Neland (29-07-2009)
Kommentar
Fra : Leif Neland


Dato : 29-07-09 10:04


"Stig Johansen" <wopr.dk@gmaill.com> skrev i en meddelelse
news:4a700963$0$308$14726298@news.sunsite.dk...
> Leif Neland wrote:
>
>> Men det rigtige er jo at lave et parameterized query.
>
> Enig.
>
>> Dette ser faktisk interessant ud:
>> http://codesnippets.joyent.com/posts/show/498
>> Her defineres funktionen execute_query
>
> Men umiddelbart ser det ud som funktionen udelukkende er lavet til SELECT
> 'ting'.
>
Jeg havde problemer med at få den til at virke...

set rs=execute_query(Conn,"Select varenr from t_produkter where id = ?
",array(id))
returnerede intet.

Den gammeldags
set rs=Conn.execute("Select varenr from t_produkter where id="&id)
fungerede

Så jeg måtte lave
set rs=execute_query(Conn,"Select count(*) as varenr from t_produkter where
id = cast(? as integer) ",array(id))

Det er nok fordi alle parametre laves som variant:
cmd.Parameters.Append(create_variant_input_parameter(cmd, "",
parameters(i)))

Man bør nok lave det som i php's
mysqli_stmt_bind_param
hvor man har en streng, der angiver typer:

A string that contains one or more characters which specify the types for
the corresponding bind variables:
Type specification chars CharacterDescription
i corresponding variable has type integer
d corresponding variable has type double
s corresponding variable has type string
b corresponding variable is a blob and will be sent in packets


Eller et array med parametrens type lige som man har et array med
parametrene.

Så har jeg fundet en dansk side "Parameterisering af databasekald med ASP og
ADO"
http://www.eksperten.dk/guide/1250
jeg vil lægge i min liste af standardsvar når nogle her har problemer med
konkatenerede queries

Leif



Leif Neland (29-07-2009)
Kommentar
Fra : Leif Neland


Dato : 29-07-09 10:18


"Leif Neland" <leif@neland.dk> skrev i en meddelelse
news:4a701097$0$15886$edfadb0f@dtext01.news.tele.dk...

>
> Så jeg måtte lave
> set rs=execute_query(Conn,"Select count(*) as varenr from t_produkter
> where id = cast(? as integer) ",array(id))
>
Rettelse:
set rs=execute_query(Conn,"Select varenr from t_produkter where id = cast(?
as integer) ",array(id))

Leif



Stig Johansen (29-07-2009)
Kommentar
Fra : Stig Johansen


Dato : 29-07-09 11:44

"Leif Neland" <leif@neland.dk> wrote in message
news:4a701097$0$15886$edfadb0f@dtext01.news.tele.dk...
> Så jeg måtte lave
> set rs=execute_query(Conn,"Select count(*) as varenr from t_produkter
where
> id = cast(? as integer) ",array(id))
>
> Det er nok fordi alle parametre laves som variant:
> cmd.Parameters.Append(create_variant_input_parameter(cmd, "",
> parameters(i)))
>
> Man bør nok lave det som i php's
> mysqli_stmt_bind_param
> hvor man har en streng, der angiver typer:
>
> A string that contains one or more characters which specify the types for
> the corresponding bind variables:
> Type specification chars CharacterDescription
> i corresponding variable has type integer
> d corresponding variable has type double
> s corresponding variable has type string
> b corresponding variable is a blob and will be sent in packets

Jeg har ikke testet din henvisning, og ved heller ikke rigtig hvor du vil
hen med dit PHP/mySQL-noget, men typeangivelse indenfor ADO er lidt mere
omfangsrigt end det du angiver.

Her er lidt copy/paste (til brug for ASP):
.....
'---- DataTypeEnum Values ----
Const adEmpty = 0
Const adTinyInt = 16
Const adSmallInt = 2
Const adInteger = 3
Const adBigInt = 20
Const adUnsignedTinyInt = 17
Const adUnsignedSmallInt = 18
Const adUnsignedInt = 19
Const adUnsignedBigInt = 21
Const adSingle = 4
Const adDouble = 5
Const adCurrency = 6
Const adDecimal = 14
Const adNumeric = 131
Const adBoolean = 11
Const adError = 10
Const adUserDefined = 132
Const adVariant = 12
Const adIDispatch = 9
Const adIUnknown = 13
Const adGUID = 72
Const adDate = 7
Const adDBDate = 133
Const adDBTime = 134
Const adDBTimeStamp = 135
Const adBSTR = 8
Const adChar = 129
Const adVarChar = 200
Const adLongVarChar = 201
Const adWChar = 130
Const adVarWChar = 202
Const adLongVarWChar = 203
Const adBinary = 128
Const adVarBinary = 204
Const adLongVarBinary = 205
.....

Hvordan man får det presset ned i dine 4 reducerede typer i PHP/mySQL, ved
jeg ikke.

--
Med venlig hilsen/Best regards
Stig Johansen




Leif Neland (29-07-2009)
Kommentar
Fra : Leif Neland


Dato : 29-07-09 12:49


"Stig Johansen" <wopr.dk@gmail.com> skrev i en meddelelse
news:4a7027a4$0$296$14726298@news.sunsite.dk...
> "Leif Neland" <leif@neland.dk> wrote in message
> news:4a701097$0$15886$edfadb0f@dtext01.news.tele.dk...
>> Så jeg måtte lave
>> set rs=execute_query(Conn,"Select count(*) as varenr from t_produkter
> where
>> id = cast(? as integer) ",array(id))
>>
>> Det er nok fordi alle parametre laves som variant:
>> cmd.Parameters.Append(create_variant_input_parameter(cmd, "",
>> parameters(i)))
>>
>> Man bør nok lave det som i php's
>> mysqli_stmt_bind_param
>> hvor man har en streng, der angiver typer:
>>
>> A string that contains one or more characters which specify the types for
>> the corresponding bind variables:
>> Type specification chars CharacterDescription
>> i corresponding variable has type integer
>> d corresponding variable has type double
>> s corresponding variable has type string
>> b corresponding variable is a blob and will be sent in packets
>
> Jeg har ikke testet din henvisning, og ved heller ikke rigtig hvor du vil
> hen med dit PHP/mySQL-noget, men typeangivelse indenfor ADO er lidt mere
> omfangsrigt end det du angiver.
>

Min ide er, at det åbenbart ikke fungerer, når funktionen angiver typen som
Const adVariant = 12
siden jeg bliver nødt til at lave en cast(? as integer) for at få en match.

At der er så mange typer i ADO gør nok at det er smartest at angive typen i
et array.

execute_query(conn,"select * from t_tabel where
id=?",array(id),array(adInteger))

Hvis funktionen bare angiver alle parametre som adVariant, mister man jo
også fordelen ved typecheckket i parameterized queries.

Leif



Stig Johansen (29-07-2009)
Kommentar
Fra : Stig Johansen


Dato : 29-07-09 13:17

Leif Neland wrote:

> Min ide er, at det åbenbart ikke fungerer, når funktionen angiver typen
> som Const adVariant = 12
> siden jeg bliver nødt til at lave en cast(? as integer) for at få en
> match.

Jeg har stadig ikke testet dit link, men umiddelbart ser det ud til der er
en fatal fuser.

Hele humlen med parameterized queries, eller 'prepared statements', som
nogle kalder det, er at selve Query strengen bliver parsed til serveren med
en sql_prepare (jeg går ud fra det er MS SQLServer vi snakker her).
Så hvis man bygger denne sekvens:
.....
Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandText = querytext
' 1 -> adCmdText
cmd.CommandType = 1
For i = 0 To UBound(parameters)
cmd.Parameters.Append(create_variant_input_parameter(cmd, "",
parameters(i)))
Next
Set cmd.ActiveConnection = connection
.....
om til:
.....
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = connection
cmd.CommandText = querytext ' her burde der blive udstedt en sql_prepare
til databasen, prøv evt. at se med profileren
.....

Det er først når statementet har været nede 'at vende' hos databasen, at
typerne bliver bestemt.

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste