Thread View: dk.edb.internet.webdesign.serverside.asp
8 messages
8 total messages
Started by Leif Neland
Mon, 05 Dec 2011 13:32
genbrug af parametre i parameterized query
Author: Leif Neland
Date: Mon, 05 Dec 2011 13:32
Date: Mon, 05 Dec 2011 13:32
19 lines
1711 bytes
1711 bytes
Hvorledes undg�r man at gentage parametren her, hvor man skal bruge den
samme v�rdi flere steder i queryet?
set oObj=Server.CreateObject("ADODB.command")
oObj.ActiveConnection = conn
with oObj
Sql = "Select hest from tabel where felt1=? or felt2=?"
.CommandText = sql
.CommandType = adCmdText
.parameters.Append
.CreateParameter("id",adInteger,adParamInput,,nummer)
.parameters.Append
.CreateParameter("id",adInteger,adParamInput,,nummer)
.execute
end with
F.ex. noget med navngivne variable?
Leif
Re: genbrug af parametre i parameterized query
Author: Stig Johansen
Date: Tue, 06 Dec 2011 08:39
Date: Tue, 06 Dec 2011 08:39
43 lines
2223 bytes
2223 bytes
Leif Neland wrote:
> Hvorledes undg�r man at gentage parametren her, hvor man skal bruge den
> samme v�rdi flere steder i queryet?
Brug denne funktion ;-)
Ado genererer selv parametre ud fra SQL'et, s� de skal bare (gen)bruges.
<%
Function query(connection, SQL, Parameters,Paramcount)
if Paramcount = -1 then Paramcount = uBound(Parameters) + 1
Dim cmd, Counter , isSelect , RowsAffected
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 = 12 ' adVariant
cmd(Counter).value = Parameters(Counter)
Next
if isSelect then
Set query = cmd.Execute
else
on error resume next
cmd.Execute RowsAffected,,-1 ' adOptionUnspecified
if Err <> 0 then RowsAffected = -1
query = RowsAffected
end if
End Function
%>
--
Med venlig hilsen
Stig Johansen
Re: genbrug af parametre i parameterized query
Author: Leif Neland
Date: Tue, 06 Dec 2011 13:28
Date: Tue, 06 Dec 2011 13:28
29 lines
2086 bytes
2086 bytes
On 06-12-2011 09:39, Stig Johansen wrote: > Leif Neland wrote: > >> Hvorledes undg�r man at gentage parametren her, hvor man skal bruge den >> samme v�rdi flere steder i queryet? > > Brug denne funktion ;-) > > Ado genererer selv parametre ud fra SQL'et, s� de skal bare (gen)bruges. > Din funktion g�r ikke at man kan n�jes med at give en parameter een gang, hvis den skal bruges flere steder. Hvis man har dette query (h�bl�st unormaliseret, men for eksemplets skyld): og det er det samme man leder efter i alle felter. query(conn,"select * from tabel where felt1=? or felt2=? or felt3=? or felt4=? or felt5=?",array(id,id,id,id,id),5) Kan man lave noget som sql="declare @id int; int=? select * from tabel where felt1=@id or felt2=@id or felt3=@id or felt4=@id or felt5=@id" Leif
Re: genbrug af parametre i parameterized query
Author: Stig Johansen
Date: Wed, 07 Dec 2011 08:41
Date: Wed, 07 Dec 2011 08:41
114 lines
4583 bytes
4583 bytes
Leif Neland wrote:
>
> Din funktion g�r ikke at man kan n�jes med at give en parameter een
> gang, hvis den skal bruges flere steder.
N�h..?
Her er et eksempel hvor parametre bliver genbrugt, men hvor funktionaliteten
er i _koden_ i stedet for i en (include)funktion:
(Dette er noget kode i samspil med en windows klient, hvor man kan hente et
datas�t som csv, rette og opdatere).
---------------------
<%@ LANGUAGE = VBScript %><% Option Explicit %><!--#include
virtual="/include_files/adovbs.inc.asp"--><!--#include
file="KurtDb.inc.asp"--><%
Dim SQL,Feltnavne,Parametre
Dim oRs
Dim Tablename
Dim Index
Dim FieldName
Dim Counter
Dim AdoCommandInsert
Dim RecordArray
Dim RecordCounter
Dim FieldArray
Tablename = Request.QueryString("Tabel")
Response.ContentType = "text/plain;"
' ----------------------- GET -------------------------
if Request.Servervariables("REQUEST_METHOD") = "GET" then
SQL = "SELECT * FROM " + Tablename
Set oRs = oConn.Execute(SQL)
if oRs.EOF then
Response.Write "No data found"
Response.End
end if
Counter = 0
for each FieldName in oRs.Fields
if Counter > 0 then Response.Write ";"
Response.Write FieldName.Name
Counter = Counter + 1
next
Response.Write vbCrLf
Do while (Not oRs.eof)
For Index=0 to (oRs.fields.count-1)
if Index > 0 then Response.Write ";"
if not isnull(oRs(Index)) then
Response.Write oRs(Index)
end if
Next
Response.Write vbCrLf
oRs.MoveNext
Loop
oRs.close
oConn.close
Set oRs = nothing
Set oConn = nothing
Response.End
end if
' ----------------------- POST -------------------------
oConn.Begintrans
SQL = "DELETE FROM " + Tablename
oConn.Execute SQL ' delete table
Set AdoCommandInsert = Server.CreateObject ("ADODB.Command")
AdoCommandInsert.ActiveConnection = oConn
AdoCommandInsert.CommandType = adCmdText
RecordArray = Split(Request.Form("Tekstfil"),vbCrLf)
FieldArray = Split(RecordArray(0),";")
Feltnavne = "("
Parametre = " VALUES("
For Counter = 0 to UBound(FieldArray) - 1
Feltnavne = Feltnavne + FieldArray(Counter) + " ,"
Parametre = Parametre + " ?,"
Next
Feltnavne = Feltnavne + FieldArray(UBound(FieldArray)) + " )"
Parametre = Parametre + " ? )"
SQL = "INSERT INTO " + Tablename + Feltnavne + Parametre
AdoCommandInsert.CommandText = sql
For RecordCounter = 1 to UBound(RecordArray)
FieldArray = Split(RecordArray(RecordCounter),";")
For Counter = 0 to UBound(FieldArray)
if Len(FieldArray(Counter)) = 0 then
AdoCommandInsert(Counter).value = null
else
AdoCommandInsert(Counter).value = FieldArray(Counter)
end if
Next
if RecordCounter < 100 then
if UBound(FieldArray) > 1 then AdoCommandInsert.Execute
end if
Next
oConn.CommitTrans
oConn.close
Set AdoCommandInsert = nothing
Set oConn = nothing
Response.Write "Table updated"
%>
----------------
--
Med venlig hilsen
Stig Johansen
Re: genbrug af parametre i parameterized query
Author: Leif Neland
Date: Wed, 07 Dec 2011 10:55
Date: Wed, 07 Dec 2011 10:55
50 lines
2916 bytes
2916 bytes
Stig Johansen wrote:
> Leif Neland wrote:
>
>>
>> Din funktion g�r ikke at man kan n�jes med at give en parameter een
>> gang, hvis den skal bruges flere steder.
>
> N�h..?
>
> Her er et eksempel hvor parametre bliver genbrugt, men hvor
> funktionaliteten er i _koden_ i stedet for i en (include)funktion:
Jeg tror vi taler forbi hinanden :-)
I en stored procedure er parametrene variable med navne, man kan bruge flere
gange
S� funktionen do_something(a,b) kan have sql'en
select * from tabel1 where f1=@a or f2=@b
union
select * from tabel 2 where f3=@a and f4=@b
som parameterized query er det
select * from tabel1 where f1=? or f2=?
union
select * from tabel 2 where f3=? and f4=?
Og derefter
.parameters.Append
.CreateParameter("",adInteger,adParamInput,,a)
.parameters.Append
.CreateParameter("",adInteger,adParamInput,,b)
.parameters.Append
.CreateParameter("",adInteger,adParamInput,,a)
.parameters.Append
.CreateParameter("",adInteger,adParamInput,,b)
og tungen skal holdes lige i munden med at k�de det rigtige sp�rgsm�lstegn
sammen med den rigtige parameters.append.
En stored procedure har den ulempe, at den ikke st�r sammen med den asp, der
bruger den. (Nogle vil m�ske se det som en fordel...)
Jeg t�nker lidt p� noget som php's sprintf:
$sql=sprintf("select * from tabel1 where f1=%1$d or f2=%2$d union select *
from tabel 2 where f3=%1$d and f4=%1$d",
$a,$b);
Hvor parametrene $a og $b kun skal angives en gang;
Leif
Re: genbrug af parametre i parameterized query
Author: Stig Johansen
Date: Wed, 07 Dec 2011 11:41
Date: Wed, 07 Dec 2011 11:41
43 lines
2533 bytes
2533 bytes
Leif Neland wrote:
> Jeg tror vi taler forbi hinanden :-)
�benbart :-)
> I en stored procedure er parametrene variable med navne, man kan bruge
> flere gange
Nu fes es ein ;-)
Du kunne da have skrevet at du ville bruge _samme_ parameter i _samme_
Statement.
> En stored procedure har den ulempe, at den ikke st�r sammen med den asp,
> der bruger den. (Nogle vil m�ske se det som en fordel...)
Brug evt. en UDF.
> Jeg t�nker lidt p� noget som php's sprintf:
> $sql=sprintf("select * from tabel1 where f1=%1$d or f2=%2$d union select *
> from tabel 2 where f3=%1$d and f4=%1$d",
> $a,$b);
> Hvor parametrene $a og $b kun skal angives en gang;
Dette er jo ikke parameterized queries - vel ?
I 'Delphiverdenen' findes denne funktionalitet.
Men det er ren 'clientside' manipulation, hvor man angiver navngivne
parametre, og 'behind the scene' mappes de op mod de korrekte ? som angivet
i SQL'et.
Det er ikke s�rligt sv�rt at lave s�dan en funktion, men det kan m�ske tage
lidt tid, s� hvis det kun er noget man skal bruge en gang, er det ikke
besv�ret v�rd.
Alternativt kan du m�ske n�jes med at mappe 2 (parameter) arrays op mod
hinanden.
--
Med venlig hilsen
Stig Johansen
Re: genbrug af parametre i parameterized query
Author: Leif Neland
Date: Wed, 07 Dec 2011 12:11
Date: Wed, 07 Dec 2011 12:11
27 lines
2245 bytes
2245 bytes
Stig Johansen wrote:
> Leif Neland wrote:
>
>> Jeg tror vi taler forbi hinanden :-)
>
> �benbart :-)
>
>> I en stored procedure er parametrene variable med navne, man kan
>> bruge flere gange
>
> Nu fes es ein ;-)
>
> Du kunne da have skrevet at du ville bruge _samme_ parameter i _samme_
> Statement.
Det, der ville v�re smart og logisk var, at den f�rste parameter i
.CreateParameter("",adInteger,adParamInput,,b) var navnet p� en @par, man
kunne bruge i sin sql.
"select id from tab where fornavn=@fornavn and efternavn=@efternavn"
og s�
.CreateParameter("@fornavn",adVarchar,adParamInput,20,"Ole")
.CreateParameter("@efternavn",adVarchar,adParamInput,20,"Olsen")
Det ville ikke skade bagudkompatibiliteten at udvide ADODB til det, brugte
man ikke @par, men ? skulle det bare fungere som det plejede :-)
Leif
Re: genbrug af parametre i parameterized query
Author: Stig Johansen
Date: Wed, 07 Dec 2011 13:37
Date: Wed, 07 Dec 2011 13:37
18 lines
2043 bytes
2043 bytes
Leif Neland wrote:
> Det, der ville v�re smart og logisk var, at den f�rste parameter i
> .CreateParameter("",adInteger,adParamInput,,b) var navnet p� en @par, man
> kunne bruge i sin sql.
Jamen som sagt skal du nok lave det som en egen funktion.
'Delphi' syntaxen er f.eks:
"Select noget from entabel where felt1= :parm1 and felt2 = :parm2 or felt3
= :parm1"
'Behind the scene' bliver det til 3 ?-tegn og 2 parametre.
--
Med venlig hilsen
Stig Johansen
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads