🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#146
Author: Leif Neland
Date: Mon, 05 Dec 2011 13:32
19 lines
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
#147
Author: Stig Johansen
Date: Tue, 06 Dec 2011 08:39
43 lines
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
#148
Author: Leif Neland
Date: Tue, 06 Dec 2011 13:28
29 lines
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
#149
Author: Stig Johansen
Date: Wed, 07 Dec 2011 08:41
114 lines
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
#150
Author: Leif Neland
Date: Wed, 07 Dec 2011 10:55
50 lines
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
#151
Author: Stig Johansen
Date: Wed, 07 Dec 2011 11:41
43 lines
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
#152
Author: Leif Neland
Date: Wed, 07 Dec 2011 12:11
27 lines
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
#153
Author: Stig Johansen
Date: Wed, 07 Dec 2011 13:37
18 lines
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