|
| 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
| |
|
|