Ho trovato la soluzione!!!!
In Function DatiFornitore() tutte le istruzioni dopo "Return...." sono inutili perchè vengono ignorate infatti dopo return il controllo torna al chiamante.
Pertanto le istruzioni close e dispose devono essere messe nel codice dopo che il controllo è tornato al chiamante OVVIO!!!
Mica tanto ovvio perchè se guardate il codice che ho postato all'inizio troverete che le istruzioni close e dispose erano comunque presenti anche dopo che il codice aveva ripreso il controllo .....
E Allora dov'era il problema?
Semplice (adesso che l'ho capito) il Garbage Collector non faceva attempo a "Passare" e ripulire prima che l'application pool si "riempisse" pertanto è stato sufficente "invitarlo" a fare il suo dovere con un GC.Collect()
Pertanto il codice giusto è
Public Class cGenerale
Inherits System.Web.UI.Page
Public Property IDFrn As Integer
Function DatiFornitore() As MySqlDataReader
Dim conn As New MySqlConnection("Data Source=localhost;Database=mydb; User ID=root; password=mypwd;")
Dim MySql As String = "SELECT * FROM fornitori WHERE id = " & IDFrn
Dim myCommand As New MySqlCommand(MySql)
myCommand.Connection = conn
conn.Open()
Return myCommand.ExecuteReader()
End Function
End Class
e nella pagina aspx:
<form id="form1" runat="server">
<% Session("conta") = Session("conta") + 1
Dim _dati = New cGenerale()
_dati.IDFrn = 1
Dim Datifrn = _dati.DatiFornitore()
While Datifrn.Read
ragsoc.Text = (Datifrn(1))
indir.Text = (Datifrn(2))
city.Text = (Datifrn(3))
prov.Text = (Datifrn(4))
End While
_dati.Dispose()
Datifrn.Dispose()
<b>GC.Collect</b>
conta.Text = Session("conta")
%>
<div>
<p>Dati del fornitore</p>
<asp:TextBox ID="conta" runat="server"></asp:TextBox>
<asp:TextBox ID="ragsoc" runat="server"></asp:TextBox>
<asp:TextBox ID="indir" runat="server"></asp:TextBox>
<asp:TextBox ID="city" runat="server"></asp:TextBox>
<asp:TextBox ID="prov" runat="server"></asp:TextBox>
</div>
</form>
Spero che questo possa essere utile a qualcun'altro.
Ciao a tutti.