Sto facendo il porting di un'applicazione Descktop (Visual Basic framework 4,7 sqlserver express 2017 Advanced) in un'applicazione Web asp form.

Purtroppo sono molto arruginito con le pagine asp.

Ho creato le prime pagine asp dell'applicazione che non richiedono accesso ai dati e tutto OK.
Ho copiato le classi della applicazione desktop nella directory app_Code

Ho inserito la connection string nel webconfig.

Il problema e' sorto alla prima chiamata ai dati.

Ricevo un errore del tipo:

System.NullReferenceException: 'Riferimento a un oggetto non impostato su un'istanza di oggetto.'

Forms_frmCambiaSocieta.get_cboSocieta ha restituito Nothing.

Lo scopo e' caricare un combobox con i dati presenti nel datatable dtSocieta.

il codice increminato e' il seguente:


Dim dtSocieta = New Data.DataTable
dtSocieta = cSocieta.LeggiSocietaDT
Dim riga = dtSocieta.NewRow
riga(0) = "0"
riga(1) = "..."
dtSocieta.Rows.InsertAt(riga, 0)
Me.cboSocieta.DataTextField = dtSocieta.Columns.Item(1).ToString <---- questa e' la riga incriminata
Me.cboSocieta.DataValueField = dtSocieta.Columns.Item(0).ToString
Me.cboSocieta.DataSource = dtSocieta

La stored procedure richiamata funziona perfettamente (eseguita da visual studio Explore Sql e restituisce 2 righe.

Il metodo LeggiSocietaDT e' il seguente:

Public Function LeggiSocietaDT() As Data.DataTable

mCmd = New Data.SqlClient.SqlCommand
mPar1 = New Data.SqlClient.SqlParameter
mPar2 = New Data.SqlClient.SqlParameter
mPar3 = New Data.SqlClient.SqlParameter
mPar4 = New Data.SqlClient.SqlParameter

With mCmd
.Connection = mConn
.CommandText = "spLeggiSocietaDT"
.CommandType = Data.CommandType.StoredProcedure
' .CommandType = Data.Commandtype.StoredProcedure

mPar1 = .CreateParameter
mPar1.ParameterName = "@ErrorNumber"
mPar1.SqlDbType = Data.SqlDbType.BigInt
mPar1.Direction = Data.ParameterDirection.Output
mPar1.Value = mErrorNumber

mPar2 = .CreateParameter
mPar2.ParameterName = "@ErrorLine"
mPar2.SqlDbType = Data.SqlDbType.BigInt
mPar2.Direction = Data.ParameterDirection.Output
mPar2.Value = mErrorLine

mPar3 = .CreateParameter
mPar3.ParameterName = "@ErrorState"
mPar3.SqlDbType = Data.SqlDbType.BigInt
mPar3.Direction = Data.ParameterDirection.Output
mPar3.Value = mErrorState

mPar4 = .CreateParameter
mPar4.ParameterName = "@ErrorMessage"
mPar4.SqlDbType = Data.SqlDbType.VarChar
mPar4.Direction = Data.ParameterDirection.Output
mPar4.Size = 250
mPar4.Value = mErrorMessage

.Parameters.Add(mPar1)
.Parameters.Add(mPar2)
.Parameters.Add(mPar3)
.Parameters.Add(mPar4)

End With

mDa = New Data.SqlClient.SqlDataAdapter(mCmd)
mDa.Fill(mDt)

Return mDt

mPar1 = Nothing
mPar2 = Nothing
mPar3 = Nothing
mPar4 = Nothing

mCmd = Nothing
End Function



Qualsiasi opinione sarebbe molto gradita. Grazie in anticipo

Alberto
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Alberto,
credo che il problema non sia nel recupero dati ma proprio in questa istruzione:
Me.cboSocieta.DataTextField


A giudicare dall'errore, sembra proprio che Me.cboSocieta stia restituendo Nothing e non la combobox che ti aspetti di trovare.

Verifica che nella tua pagina aspx ci sia un controllo DropDownList che ha ID="cboSocieta" e runat="server". Ecco un esempio:
<asp:DropDownList ID="cboSocieta" runat="server"></asp:DropDownList>


Così dovrebbe andare.

Se non riesci comunque a farlo funzionare, fai un esperimento su una pagina completamente nuova. Crei giusto la DropDownList (e nient'altro) e usi il codice che hai postato per provare a riempirla. Se funziona, vuol dire che nell'altra pagina che hai creato c'è qualche altro tipo di problema.

ciao,
Moreno

Enjoy learning and just keep making
Ho provato a creare una nuova pagina asp come segue:

<%@ Page Title="" Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="frmTest.aspx.vb" Inherits="Forms_frmTest" %>

<asp:Content ID="Content1" ContentPlaceHolderID="Head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:DropDownList ID="mioDrop" runat="server"></asp:DropDownList>
<asp:TextBox ID="txtErrore" runat="server"></asp:TextBox>
</asp:Content>

con il seguente codice VB

Partial Class Forms_frmTest
Inherits System.Web.UI.Page

Public Sub New()
If Not IsCallback Then

End If
Dim cApri As New CApri
cApri.Apri()
If cApri.Errore <> 0 Then
Me.txtErrore.Text = cApri.Errore
cApri.Chiudi()
cApri = Nothing
Exit Sub
End If

Dim cSocieta As New cSocieta
cSocieta.Connessione = cApri.connessione
Dim dt As New Data.DataTable
dt = cSocieta.LeggiSocietaDT

Me.mioDrop.DataTextField = dt.Columns.Item(1).ToString
Me.mioDrop.DataValueField = dt.Columns.Item(0).ToString
Me.mioDrop.DataSource = dt

End Sub
End Class

Ho provato a mettere un controllo dopo la lettura e nel Datatable vengono caricate 2 righe (nella tabella ci sono due societa')


La Pagina Master e' la seguente

<%@ Master Language="VB" AutoEventWireup="true" CodeFile="Site.master.vb" Inherits="SiteMaster" %>

<!DOCTYPE html>

<html lang="it">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title></title>

<link href="~/CSS/Materassi.css" rel="stylesheet" type="text/css" />
<asp:ContentPlaceHolder Id="Head" runat="server"></asp:ContentPlaceHolder>
</head>
<body class="body">
<form runat="server">


<div class="centrato">
<asp:Menu ID="MainMenu" runat="server" Orientation="Horizontal" CssClass="Testo2" ForeColor="White">
<Items>
<asp:MenuItem Text="IMPORTAZIONI" Value="IMPORTAZIONI">
<asp:MenuItem Text="Importa Jose" Value="Importa Jose" NavigateUrl="~/Forms/frmCaricaJose.aspx"></asp:MenuItem>
<asp:MenuItem Text="Importa Agenti" Value="Importa Agenti" NavigateUrl="~/Forms/frmImportaAgenti.aspx"></asp:MenuItem>
<asp:MenuItem Text="Importa Province" Value="Importa Province" NavigateUrl="~/Forms/frmCaricaProvince.aspx"></asp:MenuItem>
<asp:MenuItem Text="Importa Clienti" Value="Importa Clienti" NavigateUrl="~/Forms/frmCaricaClienti.aspx"></asp:MenuItem>
<asp:MenuItem Text="Importa Incontri" Value="Importa Incontri" NavigateUrl="~/Forms/frmCaricaIncontri.aspx"></asp:MenuItem>
<asp:MenuItem Text="Importa Telefonate" Value="Importa Telefonate" NavigateUrl="~/Forms/frmCaricaTelefonate.aspx"></asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="ANAGRAFICHE" Value="ANAGRAFICHE">
<asp:MenuItem Text="Province" Value="Province" NavigateUrl="~/Forms/frmAnaProvince.aspx"></asp:MenuItem>
<asp:MenuItem Text="Agenti" Value="Agenti" NavigateUrl="~/Forms/frmAnaAgenti.aspx"></asp:MenuItem>
<asp:MenuItem Text="Societa" Value="Societa" NavigateUrl="~/Forms/frmAnaSocieta.aspx"></asp:MenuItem>
<asp:MenuItem Text="Clienti" Value="Clienti" NavigateUrl="~/Forms/frmAnaClienti.aspx"></asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="ARCHIVI" Value="ARCHIVI">
<asp:MenuItem Text="Incontri" Value="Incontri" NavigateUrl="~/Forms/frmIncontri.aspx"></asp:MenuItem>
<asp:MenuItem Text="Telefonate" Value="Telefonate" NavigateUrl="~/Forms/frmTelefonate.aspx"></asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="WHATSAPP" Value="WHATSAPP">
<asp:MenuItem Text="Uomini/Donne" Value="Uomini/Donne" NavigateUrl="~/Forms/WASesso.aspx"></asp:MenuItem>
<asp:MenuItem Text="Onomastico" Value="Onomastico" NavigateUrl="~/Forms/WAOnomastico.aspx"></asp:MenuItem>
<asp:MenuItem Text="Compleanno" Value="Compleanno" NavigateUrl="~/Forms/WACompleanno.aspx"></asp:MenuItem>
<asp:MenuItem Text="Clienti / Non Clienti" Value="Clienti / Non Clienti" NavigateUrl="~/Forms/WAClienti.aspx"></asp:MenuItem>
<asp:MenuItem Text="Comune" Value="Comune" NavigateUrl="~/Forms/WAComune.aspx"></asp:MenuItem>
<asp:MenuItem Text="Provincia" Value="Provincia" NavigateUrl="~/Forms/WAProvincia.aspx"></asp:MenuItem>
<asp:MenuItem Text="Tutti" Value="Tutti" NavigateUrl="~/Forms/WATutti.aspx"></asp:MenuItem>
<asp:MenuItem Text="Incontro con/senza Acq." Value="Incontro con/senza Acq." NavigateUrl="~/Forms/WAIncontroAcquisto.aspx"></asp:MenuItem>
<asp:MenuItem Text="Agente" Value="Agente" NavigateUrl="~/Forms/WAAgente.aspx"></asp:MenuItem>

</asp:MenuItem>
<asp:MenuItem Text="STAMPE" Value="STAMPE">
<asp:MenuItem Text="ANAGRAFICHE" Value="ANAGRAFICHE">

</asp:MenuItem>
<asp:MenuItem Text="ARCHIVI" Value="ARCHIVI">

</asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="CAMBIA SOC." Value="CAMBIA SOC.">
</asp:MenuItem>

</Items>
</asp:Menu>
<br />
<br />
<br />
</div>


<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

</asp:ContentPlaceHolder>
<hr />
<footer>
<p>&copy; <%: DateTime.Now.Year %> - Applicazione ASP.NET</p>
</footer>
</form>
</body>
</html>

Qualsiasi idea e' la ben venuta

Alberto
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Alberto,
il problema è che cerchi di accedere ai controlli dal costruttore della pagina, cioè da qui:
Public Sub New()


In quel momento i controlli non sono stati ancora creati ed è per questo che ottieni una NullReferenceException.
Invece, devi accedere ai controlli dal metodo Page_Load della pagina.

Partial Class Forms_frmTest
Inherits System.Web.UI.Page

Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim cApri As New CApri
    cApri.Apri()
    If cApri.Errore <> 0 Then
    Me.txtErrore.Text = cApri.Errore
    cApri.Chiudi()
    cApri = Nothing
    Exit Sub
  End If

  Dim cSocieta As New cSocieta
  cSocieta.Connessione = cApri.connessione
  Dim dt As New Data.DataTable
  dt = cSocieta.LeggiSocietaDT

  Me.mioDrop.DataTextField = dt.Columns.Item(1).ToString
  Me.mioDrop.DataValueField = dt.Columns.Item(0).ToString
  Me.mioDrop.DataSource = dt
End Sub
End Class


Quando vuoi controllare se la pagina è in PostBack (cioè se l'utente ha appena inviato un form), allora usa questa condizione (all'interno del Page_Load).
If Page.IsPostBack Then
 'L'utente ha inviato il form, fai qualcosa (es. salva i dati)
End If



ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.