Salve a tutti, è da un bel po che non scrivo su questo forum che pure mi ha insegnato molto...
Ho un problema utilizzando la proprietà HasRows di un datareader che si comporta diversamente secondo il database (o il provider dati) che utilizzo.
Premetto che utilizzo una struttura con Provider Factory per creare gli oggetti di connessione su un gestionale che sfrutta 4 database diversi, in modo da scrivere un solo codice che si adatti a tutti i database variando solamente il provider di connessione e la connectionstring.
La struttura lavora da 4 anni con Access, MySQL, e PostgreSQL senza problemi, sfruttando rispettivamente OleDB, MySQL Connector .NET, ODBC per Postgresql (nativo ed installato a parte).
Ora...volendo passare tutto a connector .NET, ho installato npgsql, un provider .NET per Postgresql.
Tutto funziona alla grande ma ho problemi con l'istruzione HasRows di un datareader in alcune condizioni....
Metto un piccolo codice per spiegare dove sta il problema.
'Richiamo una estrazione di dati...
Call EstraiDati(Me, SorgenteSettori, DataGridViewSettori, "SELECT * FROM Settori")
If Dati.HasRows Then
Call ImpostaColonneSettori()
Call BindingTabellaSettori()
End If
Premettendo che DATI è un datareader dichiarato come Public e quindi visibile ovunque, nella parte dove controllo Dati.HasRows ottengo FALSE qualora nella procedura chiamata (in questo caso EstraiDati) io abbia associato il datareader ad un oggetto BindingSource....se invece verifico prima dell'associazione mi restituisce correttamente TRUE se i dati sono presenti...
Questo comportamento avviene solo sulla libreria NPGSQL e quella di SQLite (entrambe .NET), mentre non accade usando MySQL Connector, che pure è una libreria .NET, dove anche successivamente ad un binding del datareader, la proprietà HasRows si ricorda che aveva dati al suo interno...
Mi chiedo come mai e cosa posso fare per aggirare l'ostacolo dato che il controllo sulla proprietà HasRows è usato massicciamente nel mio gestionale...
Grazie a chi vorrà dedicarmi un po del suo tempo.