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;"
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.