Newsgroup: it.comp.lang.visual-basic
Titolo: mi son incartato! restituire un recordset BOF da una function

Ebbene lo confesso ...mi son incartato
sarà che stamani ne ho da far troppe e la mente mi cede!
allora!
 questo pezzetto di codice:
questo in un form
Private Sub Command1_Click()
Dim h As ADODB.Recordset
Set h = EsegueSQL("")
If Not (h Is Nothing) Then
    If h.BOF Then
        MsgBox "BOF!"
    End If
End If
End Sub
e questo per ora in un modulo
Public Function EsegueSQL(sSQL As String) As Object
    If Len(sSQL) <= 0 Then
       Set EsegueSQL = Nothing
        Exit Function
    End If
End Function
La stringa vuota per ora è un test e dimostra il mio grado di incartamento!
Cosa vorrei fare
beh innazi tutto
Public Function EsegueSQL(sSQL As String) As ADODB.RecordSet
e fin qui.....
ma e ripeto ma!
Set EsegueSQL = Nothing
qui io vorrei che non funzionasse col mio escamotage
vorrei che male che vada la funzione,
 qualunque cosa succeda,
 se va male....
mi restituisse BOF (o EOF)...ma non mi riesce!
:-(

 mi restituisse BOF (o EOF)...ma non mi riesce!
aggiramento che mi viene in mente al momento: costruire al run time un
recordset disconnesso con un solo campo e senza dati
hth
Salutoni
Sergio


Provo al volo...
Public Function EsegueSQL(sSQL As String) As Object
     If Len(sSQL) <= 0 Then
        Dim rsEmpty as new recordset
        Set EsegueSQL = rsEmpty
         Exit Function
     End If
 End Function
ciao
andrea

 Public Function EsegueSQL(sSQL As String) As Object
aggiungerei solo:
Public Function EsegueSQL(sSQL As String) As adodb.recordset
ciao
ugo

[Wodka] ha chiesto:
vorrei che male che vada la funzione,
 qualunque cosa succeda,
 se va male....
mi restituisse BOF (o EOF)...ma non mi riesce
[carta] ha suggerito:
Public Function EsegueSQL(sSQL As String) As Object
     If Len(sSQL) <= 0 Then
        Dim rsEmpty as new recordset
        Set EsegueSQL = rsEmpty
         Exit Function
     End If
 End Function
[Ugo Mangini] ha chiosato:
 aggiungerei solo:
Public Function EsegueSQL(sSQL As String) As adodb.recordset
mi permetto di far notare che se il recordset non viene aperto, l'istruzione
if recordset.eof then
genera un errore di run time....
Salutoni
Sergio

 mi restituisse BOF (o EOF)...ma non mi riesce!
Dubito che si possa fare (se non assegnando il tutto a un altro rs
effettivamente vuoto, magari con una Select che non restituisce alcun
record), perchè BOF e EOF sono si sola lettura.

 genera un errore di run time....
Y      ;-)
ciao
ugo

 Ebbene lo confesso ...mi son incartato
CUT
mi sono un po divincolato ...e adesso funziona...ma con il cavolo di
recordset di mezzo!
Posta la mia soluzione se tante volte a qualcuno interessa (sopratutto
newbie) o ha altre soluzioni...
La function è diventata:
Public Function EsegueSQL(sSQL As String, Optional RendeRecordset As Boolean
= False) As adodb.Recordset
Dim tExec As New adodb.Command
Dim rsDummy As New adodb.Recordset
'Check Stringa SQL
    If Len(sSQL) <= 0 Then
        rsDummy.Fields.Append "Fancu", adChar, 1
        rsDummy.Open
        Set EsegueSQL = rsDummy
        Exit Function
    End If
'Esecuzione SQL
On Error GoTo GestErrExec
Set tExec.ActiveConnection = ApreConn(adodb.adUseClient)
tExec.CommandText = sSQL
If RendeRecordset Then
    Set EsegueSQL = tExec.Execute
Else
    tExec.Execute
    rsDummy.Fields.Append "Fancu", adChar, 1
    rsDummy.Open
    'Err.Raise 2424 ' per debug se avviene un errore riporta lo stesso bof
    Set EsegueSQL = rsDummy
End If
Set rsDummy = Nothing
Set tExec = Nothing
Exit Function
GestErrExec:
    If rsDummy.State = adStateOpen Then
    'distrugge il recordset dummy in memoria
        rsDummy.Close
    End If
    rsDummy.Fields.Append "Fancu", adChar, 1
    rsDummy.Open
    Set EsegueSQL = rsDummy
End Function
ed il codice di test in una form
Private Sub Command2_Click()
Dim nH As adodb.Recordset
'Set nH = EsegueSQL("SELECT * FROM Contratto", False)
'Set nH = EsegueSQL("SELxxECT * FROM Contratto", False) 'Debug: genera lo
stesso bof!
If nH.BOF Then
    MsgBox "Riporta bof"
Else
    'per debug
    Set dGrid.DataSource = nH
End If
End Sub
Saluti!