[ASP] stored query ophalen met pagesizing *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 15-07 09:50
Ik heb een mooi stukje asp code om een query op te halen (Access) en page sizing te doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
' Create recordset and set the page size
Set objPagingRS = Server.CreateObject("ADODB.Recordset")
objPagingRS.PageSize = iPageSize
' You can change other settings as with any RS
'objPagingRS.CursorLocation = adUseClient
objPagingRS.CacheSize = iPageSize
dim aantal_records,aantal_records2
objPagingRS.Open [b]strSQL[/b], db_connection, adOpenStatic, adLockReadOnly, adCmdText

' Get the count of the pages using the given page size
aantal_records = objPagingRS.RecordCount
aantal_records2 = aantal_records

echter het nadeel is, hij verwacht een zelf gebouwde SQL string. Maar ik heb in mijn Access database een mooi gebouwde Query met een parameter. Dit wou ik graag zou houden, zodat ik geen SQL in me ASP paginas heb. Hoe kan ik dit nu combineren?
Normaal haalde ik een stored query met parameters zo op:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Set objPagingRS = ReturnRecords(db_connection,"qryZOEK_AIN",Array(BEDRIJF_NAAM ))
'en ReturnRecords ziet er zo uit:
Function ReturnRecords(connection,strQueryName, arrParameters)
  Dim oCommand
  Set oCommand              = Server.CreateObject("ADODB.Command")
  oCommand.ActiveConnection = Connection
  oCommand.CommandText      = strQueryName
  oCommand.CommandType      = adCmdStoredProc
  Set ReturnRecords         = oCommand.Execute(,arrParameters)
End Function

' nu wilde ik dit zo toepassen:
    Set objPagingRS = ReturnRecords(db_connection,"qryZOEK_AIN",Array(BEDRIJF_NAAM ))
    objPagingRS.PageSize = iPageSize
    objPagingRS.CacheSize = iPageSize

nu struikelt die over deze laatste regel. Kennelijk kan ik een RecordSet opgehaald met ADODB.Command niet alsnog een CacheSize laten instellen.

Iemand een idee hoe ik deze 2 dingen kan combineren?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En als je die CacheSize achterwege laat, werkt het dan wel?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 15-07 09:50
RobIII schreef op dinsdag 11 november 2008 @ 11:25:
En als je die CacheSize achterwege laat, werkt het dan wel?
nope

dan krijg ik deze melding:
De huidige recordset ondersteunt geen bladwijzers. Dit kan een beperking zijn van de voorziening of van het geselecteerde cursortype.

bij deze regel:

objPagingRS.AbsolutePage = iPageCurrent

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
trekker22 schreef op dinsdag 11 november 2008 @ 11:47:
[...]

nope

dan krijg ik deze melding:
De huidige recordset ondersteunt geen bladwijzers. Dit kan een beperking zijn van de voorziening of van het geselecteerde cursortype.

bij deze regel:

objPagingRS.AbsolutePage = iPageCurrent
Dan heeft het geheid met disconnected recordsets en je CursorLocation te maken ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 15-07 09:50
RobIII schreef op dinsdag 11 november 2008 @ 11:48:
[...]

Dan heeft het geheid met disconnected recordsets en je CursorLocation te maken ;)
nou bij beiden stel ik volgens mij geen cursor location in, maar wel een andere manier van openen van de RS:

is met paging:
objPagingRS.Open strSQL, db_connection, adOpenStatic, adLockReadOnly, adCmdText
(en zoals je ziet, is cursorlocation zelfs niet actief:
' You can change other settings as with any RS
'objPagingRS.CursorLocation = adUseClient
)

is middels ADODB.Command:
Function ReturnRecords(connection,strQueryName, arrParameters)
' Returns the recordset created by executing the (parameterised) Query with
' the name 'strQueryname' and the parameters in the array arrParameters.

Dim oCommand

Set oCommand = Server.CreateObject("ADODB.Command")
oCommand.ActiveConnection = Connection
oCommand.CommandText = strQueryName
oCommand.CommandType = adCmdStoredProc
Set ReturnRecords = oCommand.Execute(,arrParameters)
End Function

probleem is dat ik geen verschil kan vinden, of wat het verschil zou moeten maken?

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij moet je de derde parameter van ADODB.Command.Execute meegeven met opties om het cursortype te kunnen beinvloeden. Ik zou zoiets verwachten:
VBScript:
1
Set ReturnRecords = oCommand.Execute(,arrParameters, adCmdStoredProc And adAsyncFetch)

De reden waarom ik denk dat je adAsyncFetch moet gebruiken is vanwege de beschrijving die Microsoft geeft voor de Enum:
http://msdn.microsoft.com/en-us/library/ms676517(VS.85).aspx

Zie ook:
http://msdn.microsoft.com/en-us/library/ms675544(VS.85).aspx

Edit: Je zou ook nog kunnen overwegen om RecordSet.Open te gebruiken met een Command object als input, zodat je dezelfde cursoropties mee kunt geven als je nu doet.

[ Voor 13% gewijzigd door bigbeng op 11-11-2008 12:44 ]


Acties:
  • 0 Henk 'm!

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 15-07 09:50
bigbeng schreef op dinsdag 11 november 2008 @ 12:42:
Volgens mij moet je de derde parameter van ADODB.Command.Execute meegeven met opties om het cursortype te kunnen beinvloeden. Ik zou zoiets verwachten:
VBScript:
1
Set ReturnRecords = oCommand.Execute(,arrParameters, adCmdStoredProc And adAsyncFetch)

De reden waarom ik denk dat je adAsyncFetch moet gebruiken is vanwege de beschrijving die Microsoft geeft voor de Enum:
http://msdn.microsoft.com/en-us/library/ms676517(VS.85).aspx

Zie ook:
http://msdn.microsoft.com/en-us/library/ms675544(VS.85).aspx

Edit: Je zou ook nog kunnen overwegen om RecordSet.Open te gebruiken met een Command object als input, zodat je dezelfde cursoropties mee kunt geven als je nu doet.
1e oplossing werkt niet, als ik gebruik maak van And adAsyncFetch krijg ik op deze regel:

objPagingRS.CacheSize = iPageSize

toch nog deze melding:

ADODB.Recordset error '800a0bb9'

De argumenten zijn van het verkeerde type, vallen buiten het toegestane bereik of zijn in conflict met elkaar.

Zal naar 2e gaan kijken.

Acties:
  • 0 Henk 'm!

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 15-07 09:50
2e oplossing geprobeerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
  Dim oCommand

  Set oCommand              = Server.CreateObject("ADODB.Command")
  oCommand.ActiveConnection = db_connection
  oCommand.CommandText      = "qryZOEK_AIN2"
  oCommand.CommandType      = adCmdStoredProc
  Set objPagingRS = oCommand.Execute()

  objPagingRS.PageSize = iPageSize
  ' You can change other settings as with any RS
  'objPagingRS.CursorLocation = adUseClient
    objPagingRS.CacheSize = iPageSize


dus ergens moet ik volgens mij dit zwarte deel van deze regel:
objPagingRS.Open strSQL, db_connection, adOpenStatic, adLockReadOnly, adCmdText

verwerken in de manier waarop ik mijn oCommand opstel...

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ja in plaats van regel 7 in je laatste voorbeeld en je moet strSql door oCommand vervangen.

[ Voor 30% gewijzigd door bigbeng op 11-11-2008 13:35 ]


Acties:
  • 0 Henk 'm!

  • IJsbeer
  • Registratie: Juni 2001
  • Niet online
Paging moet je doen VOOR dat je de execute doet. Daarnaast is niet mogelijk om een paged recoredset te krijgen icm sprocs. Dan zul je de logica in de sproc zelf moeten bouwen.

Acties:
  • 0 Henk 'm!

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 15-07 09:50
IJsbeer schreef op dinsdag 11 november 2008 @ 13:37:
Paging moet je doen VOOR dat je de execute doet. Daarnaast is niet mogelijk om een paged recoredset te krijgen icm sprocs. Dan zul je de logica in de sproc zelf moeten bouwen.
Met deze code lijkt het wel te lukken, ik roep een stored procedure vanuit Access aan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  Set oCommand              = Server.CreateObject("ADODB.Command")
  oCommand.ActiveConnection = db_connection
  oCommand.CommandText      = "qryZOEK_AIN2"
  oCommand.CommandType      = adCmdStoredProc
  Set objPagingRS = Server.CreateObject("ADODB.Recordset")
  objPagingRS.CursorLocation = adUseClient
  objPagingRS.CursorType = adOpenStatic
  Set objPagingRS.Source = oCommand
  objPagingRS.Open
  'Set objPagingRS = oCommand.Execute()

  objPagingRS.PageSize = iPageSize
  ' You can change other settings as with any RS
  'objPagingRS.CursorLocation = adUseClient
    objPagingRS.CacheSize = iPageSize

paging werk ook prima, echter ik heb nu uit noodzaak een StoredProc genomen die geen inputwaardes heeft voor de query.

Hoe kan ik nu een parameter object doorgeven??

Dit is een voorbeeld van internet:
cmd.Parameters.Append cmd.CreateParameter &_
("@CourseID",adVarChar,adParamInput ,10,"C0450")

ECHTER: ik heb een input waarde die ik over meerdere velden gebruik:
Like "%" & [zoeknaam ] & "%"

Als je in Acces meerdere keren dit neerzet dan ziet hij dit als EEN input paramet:
((LCase([tblBEDRIJF].[BEDRIJF_NAAM])) Like "%" & [zoeknaam ] & "%")) OR (((LCase([tblBEDRIJF].[BEDRIJF_TITEL]))

op die manier gebruik je 1 zoekterm om op meerdere velden in de tabel deze zoekterm toe te passen. Maar hoe ga ik hier mee om ivm met de CreateParameter die @BEDRIJF_NAAM gebruikt om die parameter aan een specifiek veld toe te kennen...

Misschien denk ik wel heel moeilijk maar, ik wil een storedproc in Access die een tabel kan doorzoeken met 1 zoekterm, maar die zoekterm kan wel slaan op meerdere recordvelden (OF BEDRIJF_NAAM of BEDRIJF_TITEL etc etc). En dan moet ik ook nog kunnen record pagen...

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Gewoon met 1 parameter proberen.

Zie ook:
How To Call a Parameterized Query to an Access Database with ADO

Niet te moeilijk denken, gewoon doen ;)

Acties:
  • 0 Henk 'm!

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 15-07 09:50
bigbeng schreef op dinsdag 11 november 2008 @ 14:08:
Gewoon met 1 parameter proberen.

Zie ook:
How To Call a Parameterized Query to an Access Database with ADO

Niet te moeilijk denken, gewoon doen ;)
Case Solved, inderdaad gewoon doen, en het werkt perfect. Code nog voor mensen die er ooit gebruik van kunnen maken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if BEDRIJF_NAAM <> "" then
  Dim oCommand,objParam

  Set oCommand              = Server.CreateObject("ADODB.Command")
  oCommand.ActiveConnection = db_connection
  oCommand.CommandText      = "qryZOEK_AIN"
  oCommand.CommandType      = adCmdStoredProc

  Set objParam = oCommand.CreateParameter("@BEDRIJF_NAAM" , adChar, adParamInput,100 ,BEDRIJF_NAAM)
  oCommand.Parameters.Append objParam

  Set objPagingRS = Server.CreateObject("ADODB.Recordset")
  objPagingRS.CursorLocation = adUseClient
  objPagingRS.CursorType = adOpenStatic
  Set objPagingRS.Source = oCommand
  objPagingRS.Open

  objPagingRS.PageSize = iPageSize
  ' You can change other settings as with any RS
  'objPagingRS.CursorLocation = adUseClient
    objPagingRS.CacheSize = iPageSize
else
    objPagingRS.Open strSQL, db_connection, adOpenStatic, adLockReadOnly, adCmdText
end if

op eerste stuk van de IF wordt een Access stored procedure aangeroepen die 1 unieke input parameter heeft en als argument wordt BEDRIJF_NAAM gebruikt.

Door in de Access query het criteria overal hetzelfde te noemen (de [zoekterm] die je in Criteria zet) en dan geen AND maar de OR mogelijkheid, kun je mooi een Bedrijfs tabel makkelijk laten doorzoeken!

Bedankt voor alle input!!!
Pagina: 1