21. januar 2009 - 14:23Der 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;"
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
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.
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()
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...
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
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..
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
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.