Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Parameterized Queries II

0 views
Skip to first unread message

Stig Johansen

unread,
Aug 6, 2009, 1:59:30 PM8/6/09
to
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

unread,
Oct 2, 2009, 6:19:55 AM10/2/09
to
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

unread,
Oct 2, 2009, 10:00:51 AM10/2/09
to
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).

Leif Neland

unread,
Oct 20, 2009, 7:10:28 PM10/20/09
to
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

unread,
Oct 21, 2009, 1:08:02 AM10/21/09
to
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.

Stig Johansen

unread,
Oct 21, 2009, 2:17:07 AM10/21/09
to
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?

Leif Neland

unread,
Oct 21, 2009, 6:27:30 AM10/21/09
to

"Stig Johansen" <wop...@gmaill.com> skrev i en meddelelse
news:4adea7c3$0$274$1472...@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

unread,
Oct 21, 2009, 8:46:16 AM10/21/09
to
Leif Neland wrote:
> "Stig Johansen" <wop...@gmaill.com> skrev i en meddelelse
> news:4adea7c3$0$274$1472...@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')

0 new messages