/ 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
Parameterized Queries II
Fra : Stig Johansen


Dato : 06-08-09 19:00

Hej alle.

I fortsættelse af sidste post, har jeg testet lidt og lavet lidt på den
generelle funktion til Parameterized Queries.
Den ligger her:
<http://w-o-p-r.dk/tips/asp/sql.inc.asp.txt>

Indtil videre har jeg kun testet den mod MSAccess, da min MS SQLServer ikke
lige er kørende.

I en anden tråd lød det på Leif Neland, som at der kan være problemer med at
bruge adVariant, men de ting jeg har fundet på nettet beskriver parametrene
som variant arrays, så den burde være god nok.

På et eller andet tidspunkt vil jeg nok tjekke det mod min MS SQLServer -
hvis ikke andre gør det.

Eksempler på brug skrev jeg i min sidste post, men det brude være lige så
nemt som at bygge SQL dynamisk.

--
Med venlig hilsen
Stig Johansen

 
 
Leif Neland (02-10-2009)
Kommentar
Fra : Leif Neland


Dato : 02-10-09 11:20

Stig Johansen wrote:
> Hej alle.
>
> I fortsættelse af sidste post, har jeg testet lidt og lavet lidt på den
> generelle funktion til Parameterized Queries.
> Den ligger her:
> <http://w-o-p-r.dk/tips/asp/sql.inc.asp.txt>
>
> Indtil videre har jeg kun testet den mod MSAccess, da min MS SQLServer ikke
> lige er kørende.
>
> I en anden tråd lød det på Leif Neland, som at der kan være problemer med at
> bruge adVariant, men de ting jeg har fundet på nettet beskriver parametrene
> som variant arrays, så den burde være god nok.
>

Jeg har tivertifald lavet denne modifikation, der virker

Function query(connection, SQL, Parameters, Paramtypes)
Dim cmd, Counter , isSelect , RowsAffected, Paramcount
Paramcount = uBound(Parameters) + 1

if uBound(Parameters)<>uBound(Paramtypes) then
response.write "Parameterantal svarer ikke til parametertypeantal:
" & SQL
response.end
end if

Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = connection
cmd.CommandType = 1 ' adCmdText
cmd.CommandText = SQL
IF lcase(left(ltrim(SQL),6)) = "select" then
isSelect = true
else
isSelect = false
end if
For Counter = 0 To Paramcount - 1
cmd(Counter).type = Paramtypes(Counter)
cmd(Counter).value = Parameters(Counter)
Next
if isSelect then
Set execute_query = cmd.Execute
else
cmd.Execute RowsAffected,, -1
execute_query = RowsAffected
end if
End Function


Eks:
set rs = query(conn,"select navn from tabel where id=?", _
   array(request.querystring("id")),_
   array(adInteger))

Det kræver at man holder tungen lige i munden for at matche ? i en linie
med parametren i en anden og med typen i en tredie.

Leif

Stig Johansen (02-10-2009)
Kommentar
Fra : Stig Johansen


Dato : 02-10-09 15:01

Leif Neland wrote:

> Stig Johansen wrote:
>> I en anden tråd lød det på Leif Neland, som at der kan være problemer med
>> at bruge adVariant, men de ting jeg har fundet på nettet beskriver
>> parametrene som variant arrays, så den burde være god nok.
>
> Jeg har tivertifald lavet denne modifikation, der virker

Har du lyst til at uddybe, eller måske medvirke til raffinering?

>
> Function query(connection, SQL, Parameters, Paramtypes)
> Dim cmd, Counter , isSelect , RowsAffected, Paramcount
> Paramcount = uBound(Parameters) + 1

Der er(var) en årsag til jeg lavede paramcount parameteren.
Jeg har noget 'highly' dynamisk SQL, hvor antallet af parametre ikke er
kendt på forhånd, så jeg valgte at lave en Dim på eks. 100 i arrayet.

I stedet for at Redim'e og skabe problemer for GC, valgte jeg at indføre
paramcount, så uagtet at parameter array'et er 100 'stort', og dermed vil
give en uBound på 99/100, så kan man angive, at kun de f.eks. første 5
parametre skal bruges.

Nok om det, men når du indfører paramtypes jfr:
> if uBound(Parameters)<>uBound(Paramtypes) then
ville jeg gerne vide om der er problemer med visse parameter typer, ellers
fjerner jeg gerne mit forslag, så det ikke 'støjer' på nettet.

Jo - jeg er vant til at bruge named parameters, og typer, men det skulle
gerne være så nemt som muligt.

> Det kræver at man holder tungen lige i munden for at matche ? i en linie
> med parametren i en anden og med typen i en tredie.

Ja, men sådan er det.
Lidt afhængig af hvilke værktøjer du bruger, så kan man benytte named
parameters, og underliggende 'styr' på tingene (men det er ikke ASP).

--
Med venlig hilsen
Stig Johansen

Leif Neland (21-10-2009)
Kommentar
Fra : Leif Neland


Dato : 21-10-09 00:10

Hvad betyder -1 i dette, når queryet ikke er et select?

cmd.Execute RowsAffected,, -1

Og hvordan kan man opdage at der opstår en fejl?
Jeg prøvede i en insert-statement at putte en char(10) ind i et
char(8)-felt; jeg fik alligevel returneret RowsAffected = 1, men rækken
blev ikke indsat.

Er det mon fordi jeg med min modificerede udgave af "vores"
parameterizerede query-funktion havde angivet at det var en adVarChar?

Leif

Stig Johansen (21-10-2009)
Kommentar
Fra : Stig Johansen


Dato : 21-10-09 06:08

Leif Neland wrote:

> Hvad betyder -1 i dette, når queryet ikke er et select?
>
> cmd.Execute RowsAffected,, -1

Øv - det kan jeg ikke huske.
Det er en eller anden navgiven værdi, som jeg selvfølgelig skulle hav anført
i en kommentar - shame on me.

Hov, fandt den lige:
<http://www.w3schools.com/ADO/met_comm_execute.asp>
Det er adOptionUnspecified

>
> Og hvordan kan man opdage at der opstår en fejl?
> Jeg prøvede i en insert-statement at putte en char(10) ind i et
> char(8)-felt; jeg fik alligevel returneret RowsAffected = 1, men rækken
> blev ikke indsat.

Så virker det åbenbart ikke ordentligt.
Jeg synes ellers jeg havde testet det, men åbenbart ikke godt nok.

Den burde returnerer rows affected, eksempelvis ved en update.

Måske man skulle prøve adExecuteNoRecords i options i stedet.


> Er det mon fordi jeg med min modificerede udgave af "vores"
> parameterizerede query-funktion havde angivet at det var en adVarChar?

Det tror jeg ikke.
Jeg havde kun problemer med adVarChar nå længden var > 255.

Jeg har ikke lige et test eksempel, men jeg vil gerne prøve at undersøge det
på et tidspunkt.

--
Med venlig hilsen
Stig Johansen

Stig Johansen (21-10-2009)
Kommentar
Fra : Stig Johansen


Dato : 21-10-09 07:17

Leif Neland wrote:

> Og hvordan kan man opdage at der opstår en fejl?
> Jeg prøvede i en insert-statement at putte en char(10) ind i et
> char(8)-felt; jeg fik alligevel returneret RowsAffected = 1, men rækken
> blev ikke indsat.

Jeg kom i tanke om, at jeg alligevel havde noget kørende, hvor det var nemt
at teste.

Jeg prøvede at indsætte for mange tegn i et varchar(20) felt, og der får jeg
følgende fejl:
.....
Microsoft JET Database Engine error '80040e57'

The field is too small to accept the amount of data you attempted to add.
Try inserting or pasting less data.

/include_files/sql.inc.asp, line 23
.....

Har du noget 'on error resume next', eller er det måske database specifikt?

--
Med venlig hilsen
Stig Johansen

Leif Neland (21-10-2009)
Kommentar
Fra : Leif Neland


Dato : 21-10-09 11:28


"Stig Johansen" <wopr.dk@gmaill.com> skrev i en meddelelse
news:4adea7c3$0$274$14726298@news.sunsite.dk...
> Leif Neland wrote:
>
>> Og hvordan kan man opdage at der opstår en fejl?
>> Jeg prøvede i en insert-statement at putte en char(10) ind i et
>> char(8)-felt; jeg fik alligevel returneret RowsAffected = 1, men rækken
>> blev ikke indsat.
>
> ....
>
> Har du noget 'on error resume next', eller er det måske database
> specifikt?
>

Det har jeg, fordi jeg regnede med det var nok at checkke på RowsAffected.

Godt jeg kunne hente de manglende data (ordrelinier) ind fra debuggen...

Leif



Stig Johansen (21-10-2009)
Kommentar
Fra : Stig Johansen


Dato : 21-10-09 13:46

Leif Neland wrote:
> "Stig Johansen" <wopr.dk@gmaill.com> skrev i en meddelelse
> news:4adea7c3$0$274$14726298@news.sunsite.dk...
>> Har du noget 'on error resume next', eller er det måske database
>> specifikt?
>>
>
> Det har jeg, fordi jeg regnede med det var nok at checkke på RowsAffected.

Nu har jeg implementeret noget 'error handling':
<http://w-o-p-r.dk/tips/asp/sql.inc.asp.txt>
specifikt:
.....
on error resume next
cmd.Execute RowsAffected,,-1 ' adOptionUnspecified
if Err <> 0 then RowsAffected = -1
.....
Det er lidt farligt at bruge on error resume next, i hvertfald hvis man ikke
nulstiller det igen.

Jeg er mere vant til
try
noget
except
noget andet
finally osv..

men jeg mener at on error går ud af scope når funktionen forlades.

> Godt jeg kunne hente de manglende data (ordrelinier) ind fra debuggen...

I de ordresystemer jeg har lavet, ligger der tjek på længder i
inputrutinerne ;)

(Det er dog ikke så meget web, snarere lidt ovre i 'cobol-verdenen')

--
Med venlig hilsen
Stig Johansen

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

Månedens bedste
Årets bedste
Sidste års bedste