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
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 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).
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
> 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.
> 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?
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
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')