Avatar billede s0mmer Nybegynder
21. januar 2009 - 14:23 Der er 10 kommentarer og
1 løsning

Fejl i command objekt

Hej eksperter,

Jeg prøver at lave flg kode om:
Set rs = Server.CreateObject("ADODB.RecordSet")
If Request("B1") <> "" Then
  Kategori = Request("kategori")
    If Kategori = "Alle" Then
      strSQL = "SELECT * from forum order by Oprettet DESC"
    Else
      strSQL = "SELECT * from forum Where Type = ('"&Kategori&"') or Selskab = ('"&Kategori&"') order by Oprettet DESC"
    End If
Else
  strSQL = "SELECT * from forum order by Oprettet DESC"
End If

set strDSN = Server.CreateObject("ADODB.Connection")
strDSN.Open "Provider=SQLOLEDB;Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;"

'rs.Open strSQL, strDSN, 1


Til at bruge commandobjektet.

Problemet er jo at der er forskellige sql sætninger afhængige af de cases. Og nogle skal have parametre med, andre skal ikke. Hvordan gør jeg ?

Jeg prøvede flg:
Set rs = Server.CreateObject("ADODB.RecordSet")
If Request("B1") <> "" Then
  Kategori = Request("kategori")
    If Kategori = "Alle" Then
      strSQL = "SELECT * from forum order by Oprettet DESC"
    Else
      strSQL = "SELECT * from forum Where Type = ? or Selskab = ? order by Oprettet DESC"
    End If
Else
  strSQL = "SELECT * from forum order by Oprettet DESC"
End If


set strDSN = Server.CreateObject("ADODB.Connection")
strDSN.Open "Provider=SQLOLEDB;Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;"

'rs.Open strSQL, strDSN, 1
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = strDSN
cmd.CommandType = adCmdText
cmd.CommandText = strSQL
cmd.Parameters.Append cmd.CreateParameter("@Type", adVarChar, adParamInput, 255, Kategori)
cmd.Parameters.Append cmd.CreateParameter("@Selskab", adVarChar, adParamInput, 255, Kategori)
Set rs = cmd.Execute()

Men det giver fejl:
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
Avatar billede softspot Forsker
21. januar 2009 - 14:29 #1
Du kan oprette et arary med de parametre som skal putte på command-objektet, der hvor du ved hvilke parametre der skal med... når du så sætter command-objektet op, tilføjer du de parametre som nu engang ligger i array'et.
Avatar billede softspot Forsker
21. januar 2009 - 14:31 #2
Eksempelvis:

cmdPars = Array()
If Request("B1") <> "" Then
  Kategori = Request("kategori")
    If Kategori = "Alle" Then
      strSQL = "SELECT * from forum order by Oprettet DESC"
    Else
      strSQL = "SELECT * from forum Where Type = ? or Selskab = ? order by Oprettet DESC"
      cmdPars = Array( _
        cmd.CreateParameter("@Type", adVarChar, adParamInput, 255, Kategori), _
        cmd.CreateParameter("@Selskab", adVarChar, adParamInput, 255, Kategori) _
      )
    End If
Else
  strSQL = "SELECT * from forum order by Oprettet DESC"
End If


set strDSN = Server.CreateObject("ADODB.Connection")
strDSN.Open "Provider=SQLOLEDB;Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;"

'rs.Open strSQL, strDSN, 1
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = strDSN
cmd.CommandType = adCmdText
cmd.CommandText = strSQL
foreach par in cmdPars
  cmd.Parameters.Append par
next
Set rs = cmd.Execute()
Avatar billede s0mmer Nybegynder
21. januar 2009 - 14:38 #3
Mange tak !

Dog får jeg nu fejl:
Current Recordset does not support bookmarks. This may be a limitation of the provider or of the selected cursortype.

På linje:
rs.AbsolutePage = intPage

Har du nogen idé ?
Avatar billede softspot Forsker
21. januar 2009 - 16:04 #4
Ja, det er fordi cmd.Execute leverer et ForwardOnly recordset, så det kan du ikke bruge til at surfe frem og tilbage i (eller paginere over). Hvis det er det du vil, skal du oprette recordset-objektet (som du havde gjort oprindeligt) og så smide command-objektet ned til recordsettet i stedet for en SQL-sætning. Det er ikke noget jeg har arbejdet med, men jeg vil mene det ser nogenlunde således ud:

Set rs = Server.CreateObject("ADODB.RecordSet")
cmdPars = Array()
If Request("B1") <> "" Then
  Kategori = Request("kategori")
    If Kategori = "Alle" Then
      strSQL = "SELECT * from forum order by Oprettet DESC"
    Else
      strSQL = "SELECT * from forum Where Type = ? or Selskab = ? order by Oprettet DESC"
      cmdPars = Array( _
        cmd.CreateParameter("@Type", adVarChar, adParamInput, 255, Kategori), _
        cmd.CreateParameter("@Selskab", adVarChar, adParamInput, 255, Kategori) _
      )
    End If
Else
  strSQL = "SELECT * from forum order by Oprettet DESC"
End If

set strDSN = Server.CreateObject("ADODB.Connection")
strDSN.Open "Provider=SQLOLEDB;Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;"

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = strDSN
cmd.CommandType = adCmdText
cmd.CommandText = strSQL
foreach par in cmdPars
  cmd.Parameters.Append par
next
rs.Open cmd, strDSN, adOpenStatic, adLockOptimistic

eller sådan noget i den stil (kig lige på flagenes navne på MSDN, hvis dette ikke fungerer)...

Det er også muligt der er noget fnidder med at strDSN sættes på både command-objektet og i kaldet til Open, men i så fald, skal du nok bare undlade at sende den med til Open...
Avatar billede s0mmer Nybegynder
21. januar 2009 - 16:54 #5
Hvis jeg copy & paste får jeg:

Expected end of statement

/xxx/messageIB.asp, line 129

"foreach par in cmdPars"
Avatar billede softspot Forsker
21. januar 2009 - 17:13 #6
Der er lige et par ting der skal ændres i det kode jeg har foreslået.

Først og fremmest er cmd-objektet slet ikke initieret på det tidspunkt jeg bruger det (under opbygningen af parameterlisten i forbindelse med den SQL der har parametre).

For det andet, så hedder det ikke foreach i VBScript (jeg har kodet C# på det sidste :-)), det hedder for each. Derfor vil jeg mene denne kode fungerer bedre:

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = strDSN
cmd.CommandType = adCmdText
cmdPars = Array()
If Request("B1") <> "" Then
  Kategori = Request("kategori")
    If Kategori = "Alle" Then
      strSQL = "SELECT * from forum order by Oprettet DESC"
    Else
      strSQL = "SELECT * from forum Where Type = ? or Selskab = ? order by Oprettet DESC"
      cmdPars = Array( _
        cmd.CreateParameter("@Type", adVarChar, adParamInput, 255, Kategori), _
        cmd.CreateParameter("@Selskab", adVarChar, adParamInput, 255, Kategori) _
      )
    End If
Else
  strSQL = "SELECT * from forum order by Oprettet DESC"
End If

set strDSN = Server.CreateObject("ADODB.Connection")
strDSN.Open "Provider=SQLOLEDB;Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;"

cmd.CommandText = strSQL
for each par in cmdPars
  cmd.Parameters.Append par
next
rs.Open cmd, strDSN, adOpenStatic, adLockOptimistic
Avatar billede s0mmer Nybegynder
23. januar 2009 - 10:44 #7
softspot > jeg tror vi er tæt på. hvis jeg præcis kopierer det du skriver (med slf de rigtig sql oplys.) får jeg flg fejl:

Object required: 'cmd.ActiveConnection'

på l.
set cmd.ActiveConnection = strDSN

Hvis jeg så flytter disse linjer:
set strDSN = Server.CreateObject("ADODB.Connection")
strDSN.Open "Provider=SQLOLEDB;Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;"

i toppen får jeg flg fejl:
Cannot change the ActiveConnection property of a Recordset object which has a Command object as its source.

på linjen:
rs.Open cmd, strDSN, adOpenStatic, adLockOptimistic


- Jeg tror fejlen er ret indlysende, jeg kan bare ikke fixe det..
Avatar billede softspot Forsker
23. januar 2009 - 16:07 #8
Umiddelbart ville jeg vælge at flytte linierne med conneciton-koden op foran command-objektets oprettelse som du selv foreslår og så vil jeg undlade at sende connectionobjektet med over til recordsetobjektet's open-metode:

set strDSN = Server.CreateObject("ADODB.Connection")
strDSN.Open "Provider=SQLOLEDB;Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;"

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = strDSN
cmd.CommandType = adCmdText
cmdPars = Array()
If Request("B1") <> "" Then
  Kategori = Request("kategori")
    If Kategori = "Alle" Then
      strSQL = "SELECT * from forum order by Oprettet DESC"
    Else
      strSQL = "SELECT * from forum Where Type = ? or Selskab = ? order by Oprettet DESC"
      cmdPars = Array( _
        cmd.CreateParameter("@Type", adVarChar, adParamInput, 255, Kategori), _
        cmd.CreateParameter("@Selskab", adVarChar, adParamInput, 255, Kategori) _
      )
    End If
Else
  strSQL = "SELECT * from forum order by Oprettet DESC"
End If

cmd.CommandText = strSQL
for each par in cmdPars
  cmd.Parameters.Append par
next
rs.Open cmd, , adOpenStatic, adLockOptimistic
Avatar billede s0mmer Nybegynder
28. januar 2009 - 10:40 #9
softspot > virker perfekt :) send svar og du ska få points !
Avatar billede softspot Forsker
28. januar 2009 - 12:21 #10
Velbekomme :)
Avatar billede softspot Forsker
28. januar 2009 - 14:19 #11
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester