Newsgroup: it.comp.lang.visual-basic
Titolo: Leggere variabile in dll da ASP

Scusate, è la prima volta che utilizzo una dll per l'accesso ai dati
di un database.
Il mio problema è che ho una pagina ASP che richiama una funzione
della dll che fa una query che restituisce un dato valore:
Public Function Get_Menu_Top(ByRef objRecordset As Variant) As Integer
On Error GoTo errHandle
    Dim Connection As ADODB.Connection
    Dim sql As String
    If Not OpenDb(my_strconn, Connection) Then GoTo errHandle
    sql = "SELECT titolo FROM Menu_top"
    Set objRecordset = New ADODB.Recordset
    objRecordset.open sql, Connection, adOpenStatic, adLockReadOnly
        While Not objRecordset.EOF
            menuVoce = objRecordset(titolo)
        objRecordset.MoveNext
        Wend
    Set Connection = Nothing
    On Error Resume Next
    Exit Function
errHandle:
    Get_Menu_Top = -1
End Function
Come faccio a leggere la variabile "menuVoce" dalla mia pagina ASP?
Non devo semplicemente richiamarla (Response.Write(menuVoce))???
So che potrei usare il seguente codice:
Response.Write(objRs.Fields("titolo")), ma io vorrei che la variabile
sia inclusa nel codice della dll e richiamata dalla pagina ASP.
Grazie a tutti in anticipo.
Biobio


suppongo che "menuVoce" sia una variabile stringa o simile ma
dichiarata come globale in un BAS, perche' altrimenti il fatto stesso
che tu parli di "DLL" ti da la soluzione al problema.
Quello che intendo e': dato che una DLL in VB puo' solo esporre
funzioni transitando da metodi di classi pubbliche, se gia' adesso sei
in grado di chiamare Get_Menu_Top dalla pagina ASP e' perche' hai
dovuto fare un CreateObject di una qualche classe, o sbaglio? In
questo caso ti basta semplicemente aggiungere una property pubblica a
questa classe che espone il valore di menuVoce, e sei a posto.
Se non e' come credo, allora prova a spiegare meglio com'e' questa
fantomatica DLL

 - Mostra testo tra virgolette -
Purtroppo non conosco Visual Basic, non so come spiegare meglio il
problema. La mia è una classe con 2 funzioni, una che fa la
connessione al database e l'altra che fa la query che ho postato. La
compilo e la metto sul server nella direcotry _com.
Nella pagina ASP la richiamo con:
Set FtwObj   = Server.CreateObject("Icps.DbQuery")
Set objRs 	   = Server.CreateObject("ADODB.Recordset")
Quello che io vorrei è che se la query mi tira fuori due campi del
database, vorrei inserirli in 2 variabili e richiamarle dalla pagina
ASP.


Se per "due campi" intendi 2 colonne, allora basta che aggiungi due
proprieta' alla classe Icps.DBQuery, le valorizzi all'interno della
funzione che esegue la query e sei a posto, nel tuo esempio di codice
ASP le leggerai come FtwObj.MiaProperty1 e FtwObj.MiaProperty2.
Se intendi invece che la query puo' ritornare 2 o piu' *record*,
allora devi fare in modo di esporre un lista di valori invece che una
singola property, per esempio usando un oggetto Collection, da
caricare nel ciclo While che fai sul recordset.
Incidentalmente non credo sia una buona pratica definire la funzione
che prende come parametro il recordset ByRef, specie se usata via ASP
e tanto piu' che non vuoi accedere direttamente alle sue proprieta';
tanto vale crearlo internamente esattamente come fai per l'oggetto
ADODB.Connection

 - Mostra testo tra virgolette -
La query mi restituisce 2 campi di una tabella per n record!!!
So che ti chiedo molto, potresti postare un esempio sul codice?
Questo è quello che ho nella mia classe:
Public my_strconn As String
Private Sub Class_Initialize()
    my_strconn = "quì metto la stringa di connessione"
    Set obj = Nothing
End Sub
'Apro le connessioni al db
Private Function OpenDb(ByVal strConn As String, ByRef objConn As
Object) As Boolean
    On Error GoTo errHandle
    If Len(Trim(strConn)) = 0 Then GoTo errHandle
    If IsObject(objConn) Then
        Set objConn = New ADODB.Connection
        objConn.open strConn
    End If
    OpenDb = True
    On Error Resume Next
    Exit Function
errHandle:
    OpenDb = False
End Function
Public Function Get_Menu_Top(ByRef objRecordset As Variant) As
Integer
On Error GoTo errHandle
    Dim Connection As ADODB.Connection
    Dim sql As String
    If Not OpenDb(my_strconn, Connection) Then GoTo errHandle
    sql = "SELECT titolo, link FROM Menu_top"
    Set objRecordset = New ADODB.Recordset
    objRecordset.open sql, Connection, adOpenStatic, adLockReadOnly
        While Not objRecordset.EOF
            menuVoce = objRecordset(titolo)
            menuLink = objRecordset(link)
        objRecordset.MoveNext
        Wend
    Set Connection = Nothing
    On Error Resume Next
    Exit Function
errHandle:
    Get_Menu_Top = -1
End Function
Ti ringrazio molto per la disponibilità.

 Questo è quello che ho nella mia classe:
Tralasciando altre cose che sarebbe bene modificare, prova qualcosa
del genere:
Definisci una nuova classe MenuItem e inserisci questo codice
Option Explicit
'A titolo di esempio, per brevità usiamo due variabili Public,
'ma a rigore andrebbero dichiarate Private e create le routine
Property Get/Let
Public Voce As String
Public Link As String
modifica quindi il metodo Get_Menu_Top delle tua classe cosi':
Public Function Get_Menu_Top() As Collection
On Error GoTo errHandle
    Dim Connection As ADODB.Connection
    Dim sql As String
    'Questo era inutile farselo passare ByRef se poi, giustamente, non
vuoi usarlo direttamente da codice ASP
    Dim objRecordset As ADODB.Recordset
    Dim clItems As Collection
    Dim item As MenuItem
    If Not OpenDb(my_strconn, Connection) Then GoTo errHandle
    sql = "SELECT titolo, link FROM Menu_top"
    Set objRecordset = New ADODB.Recordset
    objRecordset.open sql, Connection, adOpenStatic, adLockReadOnly
    'Inizializziamo la collection
    Set clItems = New Collection
    While Not objRecordset.EOF
        'Per ogni record creiamo una istanza di MenuItem e la
aggiungiamo alla collection
        item = New MenuItem
        item.Voce = objRecordset(titolo)
        item.Link = objRecordset(Link)
        clItems.Add item
        objRecordset.MoveNext
    Wend
    'restituiamo la collection se è andato tutto bene
    Set Get_Menu_Top = clItems
    Set Connection = Nothing
    On Error Resume Next
    Exit Function
errHandle:
    'restituiamo Nothing in caso di errore
    Set Get_Menu_Top = Nothing
End Function
il codice della pagina ASP potrebbe essere simile a questo:
<%
Option Explicit
%>
<html>
<head>
<title>Test</title>
</head>
<body>
<%
Dim objQuery, objMenuItems, objMenuItem
Set objQuery = Server.CreateObject("Icps.DBQuery")
Set objMenuItems = objQuery.Get_Menu_Top
If objMenuItems Is Nothing Then
  Response.Write "Errore"
Else
  Response.Write "<ol>"
  For Each objMenuItem In objMenuItems
    Response.Write "<li><a href=""" & objMenuItem.Link & """>" &
objMenuItem.Voce & "</a></li>"
  Next
  Response.Write "</ol>"
End If
%>
</body>
</html>