+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 8 su 8

Discussione: ASP.NET, DetailView, ID, Date e domande varie per Guestbook

  1. #1
    L'avatar di Jedi-78
    Jedi-78 non è in linea Novello
    Post
    32

    ASP.NET, DetailView, ID, Date e domande varie per Guestbook

    Buongiorno a tutti, eccovi una lista di un bel po' di domande da newbie.
    Sto creando un semplice Guestbook
    Qui il codice ASP.NET
    codice:
    <asp:SqlDataSource ID="sqlGuestbook" runat="server" 
            ConnectionString="<%$ ConnectionStrings:Guestbook %>" 
            SelectCommand="SELECT * FROM [tbGuestbook]" 
            ConflictDetection="CompareAllValues" 
            DeleteCommand="DELETE FROM [tbGuestbook] WHERE [ID] = @original_ID AND [Nome] = @original_Nome AND [Cognome] = @original_Cognome AND [Prov] = @original_Prov AND [Data] = @original_Data AND (([email] = @original_email) OR ([email] IS NULL AND @original_email IS NULL)) AND (([URL] = @original_URL) OR ([URL] IS NULL AND @original_URL IS NULL)) AND [Commento] = @original_Commento" 
            InsertCommand="INSERT INTO [tbGuestbook] ([ID], [Nome], [Cognome], [Prov], [Data], [email], [URL], [Commento]) VALUES (@ID, @Nome, @Cognome, @Prov, @Data, @email, @URL, @Commento)" 
            OldValuesParameterFormatString="original_{0}" 
            UpdateCommand="UPDATE [tbGuestbook] SET [Nome] = @Nome, [Cognome] = @Cognome, [Prov] = @Prov, [Data] = @Data, [email] = @email, [URL] = @URL, [Commento] = @Commento WHERE [ID] = @original_ID AND [Nome] = @original_Nome AND [Cognome] = @original_Cognome AND [Prov] = @original_Prov AND [Data] = @original_Data AND (([email] = @original_email) OR ([email] IS NULL AND @original_email IS NULL)) AND (([URL] = @original_URL) OR ([URL] IS NULL AND @original_URL IS NULL)) AND [Commento] = @original_Commento">
            <DeleteParameters>
                <asp:Parameter Name="original_ID" Type="Int64" />
                <asp:Parameter Name="original_Nome" Type="String" />
                <asp:Parameter Name="original_Cognome" Type="String" />
                <asp:Parameter Name="original_Prov" Type="String" />
                <asp:Parameter DbType="Date" Name="original_Data" />
                <asp:Parameter Name="original_email" Type="String" />
                <asp:Parameter Name="original_URL" Type="String" />
                <asp:Parameter Name="original_Commento" Type="String" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="Nome" Type="String" />
                <asp:Parameter Name="Cognome" Type="String" />
                <asp:Parameter Name="Prov" Type="String" />
                <asp:Parameter DbType="Date" Name="Data" />
                <asp:Parameter Name="email" Type="String" />
                <asp:Parameter Name="URL" Type="String" />
                <asp:Parameter Name="Commento" Type="String" />
                <asp:Parameter Name="original_ID" Type="Int64" />
                <asp:Parameter Name="original_Nome" Type="String" />
                <asp:Parameter Name="original_Cognome" Type="String" />
                <asp:Parameter Name="original_Prov" Type="String" />
                <asp:Parameter DbType="Date" Name="original_Data" />
                <asp:Parameter Name="original_email" Type="String" />
                <asp:Parameter Name="original_URL" Type="String" />
                <asp:Parameter Name="original_Commento" Type="String" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="ID" Type="Int64" />
                <asp:Parameter Name="Nome" Type="String" />
                <asp:Parameter Name="Cognome" Type="String" />
                <asp:Parameter Name="Prov" Type="String" />
                <asp:Parameter DbType="Date" Name="Data" />
                <asp:Parameter Name="email" Type="String" />
                <asp:Parameter Name="URL" Type="String" />
                <asp:Parameter Name="Commento" Type="String" />
            </InsertParameters>
        </asp:SqlDataSource>
    
        <asp:DetailsView ID="dvGuestbook" runat="server" AutoGenerateRows="False"  AutoGenerateInsertButton=true
            DataKeyNames="ID" DataSourceID="sqlGuestbook" Height="50px" Width="125px" ondatabound="dvGuestbook_DataBound"
             >
            <Fields>
                <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" 
                    SortExpression="ID" Visible="False" />
                <asp:BoundField DataField="Nome" HeaderText="Nome" SortExpression="Nome" />
                <asp:BoundField DataField="Cognome" HeaderText="Cognome" SortExpression="Cognome" />
                <asp:BoundField DataField="Prov" HeaderText="Prov" SortExpression="Prov" />
                <asp:TemplateField HeaderText="Data" InsertVisible="False" ShowHeader="False" 
                    SortExpression="Data">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Data") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%=Now()  %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="email" HeaderText="email" SortExpression="email" />
                <asp:BoundField DataField="URL" HeaderText="URL" SortExpression="URL" />
                <asp:BoundField DataField="Commento" HeaderText="Commento" 
                    SortExpression="Commento" />
            </Fields>
        </asp:DetailsView>
    Questo invece è il codebehind
    codice:
    Partial Class Guestbook_Guestbook
        Inherits System.Web.UI.Page
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Not Page.IsPostBack Then
                ddProv.SelectedValue = "VA"
            End If
            
        End Sub
        Protected Sub dvGuestbook_DataBound(ByVal sender As Object, ByVal e As EventArgs)
            If dvGuestbook.DataItemCount = 0 Then
                dvGuestbook.ChangeMode(DetailsViewMode.Insert)
            End If
        End Sub
    End Class
    Ora le domande.
    Primo di tutto, cosa fastidiosissima. Vengo dal buon vecchio ASP + MS Access. Qui non c'era problema alcuno con le ID.
    Perché questo benedetto potente SQL non riesce a capire come generare un'ID da solo senza andare in crash??

    Secondo, in una DetailView, come obbligo un campo ad avere un certo valore di default?

    Terzo, come inglobo un DropDown (qui per esempio, ddProv contiene le provincie) in una DetailView?

    Quarto, appunto derivante da ASP ho usato il vecchio metodo <%=Now()%> per inserire la data.
    Come si fa realmente in questo linguaggio?
    No. Try not. Do. Or do NOT! There's no TRY! (Master Yoda)

  2. #2
    L'avatar di Jedi-78
    Jedi-78 non è in linea Novello
    Post
    32
    Allora... ad alcune domande ho trovato risposta da solo rileggendo i codici...

    Per l'ID, mi è bastato rimuovere questa parte
    codice:
    <asp:Parameter Name="ID" Type="Int64" />
    da InsertParameters ed ho notato che, sempre da lì, mi bastava aggiungere 'DefaultValue=' per specificare i valori di default.

    Restano però valide le altre domande.

    come faccio a mettere in 'DefaultValue=' la data odierna?

    e come collego la DropDownList al campo 'Prov'?
    No. Try not. Do. Or do NOT! There's no TRY! (Master Yoda)

  3. #3
    L'avatar di SignIn
    SignIn non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,026
    Quote Originariamente inviato da Jedi-78 Visualizza il messaggio
    Perché questo benedetto potente SQL non riesce a capire come generare un'ID da solo senza andare in crash??
    Non capisco se quando ti riferisci a SQL ti riferisci al linguaggio per l'accesso al DB o erroneamente all'oggetto SqlDataSource.
    Sottolineo questo perchè mi sembra di capire visto "l'errore" (o per meglio dire il comportamento da te descritto, visto che non hai postato nessun messaggio di errore) che fai uso di Access come "DB", di conseguenza sarebbe più corretto far uso dell'oggetto AccessDataSource.
    Rimane il fatto che nel Command di insert non ci deve essere nessun riferimento al campo chiave come hai già capito e come già detto qui:
    Insert in Gridview

    Quote Originariamente inviato da Jedi-78 Visualizza il messaggio
    Vengo dal buon vecchio ASP + MS Access. Qui non c'era problema alcuno con le ID.
    Anche in Asp.Net basta sapere le cose
    Ti vorrei far riflettere su una cosa. Quanto avresti dovuto scrivere (da precisare che non è sempre un male) per fare la stessa cosa in Asp classico?

    Quote Originariamente inviato da Jedi-78 Visualizza il messaggio
    come faccio a mettere in 'DefaultValue=' la data odierna?
    In questo caso poichè su oggetti ControlParameter non è possibile utilizzare DataBinding puoi per esempio implementare l'evento Inserting dell'oggetto SqlDataSource e verificare:
    1)se il value del parameter è uguale a null assegni il valore di default.
    Giusto per farti un esempio (da adattare al tuo caso):
    codice:
    protected void SqlDataSource1_Inserting(object sender, SqlDataSourceCommandEventArgs e)
    {
      if (e.Command.Parameters["@NomeParametro"].Value == null)
        e.Command.Parameters["@NomeParametro"].Value = DateTime.Now.ToString();
    }
    Ovviamente questa è solo una strada che si può percorrere per risolvere il "problema", ma non l'unica.

    Quote Originariamente inviato da Jedi-78 Visualizza il messaggio
    e come collego la DropDownList al campo 'Prov'?
    In questo caso non mi è chiara la domanda. Nel senso che per avere un DropDownList devi avere una lista di valori, il che significa che probabilmente ti serve un altro oggetto (AccessDataSource, SqlDataSource, classe ecc) per recuperare questa lista da DB.
    A questo punto basta inserire qualcosa del genere nel markup del controllo DetailsView:
    codice:
    <asp:TemplateField>
      <ItemTemplate>
        <asp:DropDownList ID="ddlProv" runat="server" DataSourceID="SqlDataSource2" 
                          DataTextField="QualifiedName" DataValueField="QualifiedName"></asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
    ed hai ottenuto il popolamento del controllo.

  4. #4
    L'avatar di Jedi-78
    Jedi-78 non è in linea Novello
    Post
    32
    Quote Originariamente inviato da SignIn Visualizza il messaggio
    Non capisco se quando ti riferisci a SQL ti riferisci al linguaggio per l'accesso al DB o erroneamente all'oggetto SqlDataSource.
    Sottolineo questo perchè mi sembra di capire visto "l'errore" (o per meglio dire il comportamento da te descritto, visto che non hai postato nessun messaggio di errore) che fai uso di Access come "DB", di conseguenza sarebbe più corretto far uso dell'oggetto AccessDataSource.
    Mi riferisco al SQLDataSource ed al fatto che l'estensione del database sia .MDF (creato andando sulla cartella App_Data in Visual Web Developer e dicendo 'Aggiungi Nuovo Elemento' - 'Database SQL Server')
    Rimane il fatto che nel Command di insert non ci deve essere nessun riferimento al campo chiave come hai già capito e come già detto qui:
    Insert in Gridview


    Anche in Asp.Net basta sapere le cose
    Ti vorrei far riflettere su una cosa. Quanto avresti dovuto scrivere (da precisare che non è sempre un male) per fare la stessa cosa in Asp classico?
    un po'... ma implementata una volta la stringa di connessione al database, trovarmi in mano il vecchio codice di connessione, beh... era più lungo da scrivere, ma mi faceva sentire più sicuro di ciò che stavo facendo.

    Voglio dire...quando inserivo i campi da aggiungere in una tabella, aggiornare, eliminare... è vero che rischiavo di fare errori che senza debugger dovevo controllare -magari impiegando ore/giorni a farlo- ma almeno sapevo già come stavo strutturando.

    Questa è la maggior differenza tra la buona vecchia programmazione basata solo sul codice e la più recente 'Visual'... e lo ammetto, semplificherà molto l'esistenza... ma non riesco a "farla mia" ancora
    In questo caso poichè su oggetti ControlParameter non è possibile utilizzare DataBinding puoi per esempio implementare l'evento Inserting dell'oggetto SqlDataSource e verificare:
    1)se il value del parameter è uguale a null assegni il valore di default.
    Giusto per farti un esempio (da adattare al tuo caso):
    codice:
    protected void SqlDataSource1_Inserting(object sender, SqlDataSourceCommandEventArgs e)
    {
      if (e.Command.Parameters["@NomeParametro"].Value == null)
        e.Command.Parameters["@NomeParametro"].Value = DateTime.Now.ToString();
    }
    Ecco un'altra particolarità del .NET che non capisco, che non mi riesce di capire.

    Trasformare l'oggetto data/ora in una stringa è illogico nel vecchio ASP e farebbe solo nascere estrema confusione. (Esempio. 03/02/2009, inserendola così poi un server con disposizione diversa dell'ora/data me lo tradurrebbe in 02 marzo, invece che il 03 febbraio come inserito)
    Ovviamente questa è solo una strada che si può percorrere per risolvere il "problema", ma non l'unica.


    In questo caso non mi è chiara la domanda. Nel senso che per avere un DropDownList devi avere una lista di valori, il che significa che probabilmente ti serve un altro oggetto (AccessDataSource, SqlDataSource, classe ecc) per recuperare questa lista da DB.
    A questo punto basta inserire qualcosa del genere nel markup del controllo DetailsView:
    codice:
    <asp:TemplateField>
      <ItemTemplate>
        <asp:DropDownList ID="ddlProv" runat="server" DataSourceID="SqlDataSource2" 
                          DataTextField="QualifiedName" DataValueField="QualifiedName"></asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
    ed hai ottenuto il popolamento del controllo.
    codice:
    <asp:DropDownListID="ddProv"runat="server"DataSourceID="sqlTarghe"DataTextField="Provincia"DataValueField="Targa">
    </asp:DropDownList>

    Ecco qui... allora... dicevamo...

    ancora non ho trovato un sito od un manuale che mi spieghi l'ItemTemplate eccetera... o meglio.

    Ho capito come questo venga usato... ma non implementato.

    Con il codice che ho copiato sopra, per esempio, come faccio a capire al .NET a quale campo -del database Guestbook- deve fare il Binding?

    No. Try not. Do. Or do NOT! There's no TRY! (Master Yoda)

  5. #5
    L'avatar di Jedi-78
    Jedi-78 non è in linea Novello
    Post
    32
    Dunque...
    Inserito il codice nella codebehind in questo modo
    codice:
     
        Protected Sub SqlGuestbook_Inserting(ByVal sender As Object, ByVal e As SqlDataSourceCommandEventArgs)
            If e.Command.Parameters("@Data").Value Is Nothing Then
                e.Command.Parameters("@Data").Value = DateTime.Now()
            End If
        End Sub

    Mi torna questo errore:

    Errore server nell'applicazione '/WebSitetest2009'.

    Impossibile inserire il valore NULL nella colonna 'Data' della tabella 'I:\WEBSITETEST2009\APP_DATA\GUESTBOOK.MDF.dbo.tbG uestbook'. La colonna non ammette valori Null. INSERT avrà esito negativo.
    L'istruzione è stata interrotta.


    Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

    Dettagli eccezione: System.Data.SqlClient.SqlException: Impossibile inserire il valore NULL nella colonna 'Data' della tabella 'I:\WEBSITETEST2009\APP_DATA\GUESTBOOK.MDF.dbo.tbG uestbook'. La colonna non ammette valori Null. INSERT avrà esito negativo.
    L'istruzione è stata interrotta.

    Errore nel codice sorgente:

    Durante l'esecuzione della richiesta Web corrente è stata generata un'eccezione non gestita. Per informazioni sull'origine e la posizione dell'eccezione, vedere l'analisi dello stack dell'eccezione riportata di seguito.
    Suggerimenti?
    Ultima modifica di Jedi-78; 30-03-2009 09:21 
    No. Try not. Do. Or do NOT! There's no TRY! (Master Yoda)

  6. #6
    L'avatar di SignIn
    SignIn non è in linea Scribacchino
    Luogo
    Milano
    Post
    1,026
    Quote Originariamente inviato da Jedi-78 Visualizza il messaggio
    Voglio dire...quando inserivo i campi da aggiungere in una tabella, aggiornare, eliminare... è vero che rischiavo di fare errori che senza debugger dovevo controllare -magari impiegando ore/giorni a farlo- ma almeno sapevo già come stavo strutturando.

    Questa è la maggior differenza tra la buona vecchia programmazione basata solo sul codice e la più recente 'Visual'... e lo ammetto, semplificherà molto l'esistenza... ma non riesco a "farla mia" ancora
    Non è solo una questione di wizard messi a disposizione dallo strumento Visual Studio, ma la possibilità di utilizzare un Framework solido e ormai maturo per poter costruire le proprie applicazioni, sia che siano in ambito web sia che siano in ambito windows.

    Quote Originariamente inviato da Jedi-78 Visualizza il messaggio
    Ecco un'altra particolarità del .NET che non capisco, che non mi riesce di capire.

    Trasformare l'oggetto data/ora in una stringa è illogico nel vecchio ASP e farebbe solo nascere estrema confusione. (Esempio. 03/02/2009, inserendola così poi un server con disposizione diversa dell'ora/data me lo tradurrebbe in 02 marzo, invece che il 03 febbraio come inserito)
    Ripeto una cosa forse ovvia, le cose possono sembrare illogiche quando non si conoscono.
    Giusto per farti capire le varie possibilità che il Framework mette a disposizione:
    1) se nel tuo codice (non faccio riferimento al tuo caso preciso, ma in generale) hai la necessità di rappresentare un oggetto Datetime in stringa, ecco come puoi personalizzarla:
    Stringhe di formato data e ora personalizzate
    2)Oggetto Datetime

    Per quanto riguarda la data da inserire in Sql Server, è necessario far uso del formato ISO 8601 (la lista completa la trovi qui: ISO 8601) per la rappresentazione dei valori data e ora, in questo modo si è svincolati dalla localizzazione.

    Quote Originariamente inviato da Jedi-78 Visualizza il messaggio
    Ecco qui... allora... dicevamo...
    ancora non ho trovato un sito od un manuale che mi spieghi l'ItemTemplate eccetera... o meglio.
    Ho capito come questo venga usato... ma non implementato.
    Un buon punto di partenza è sempre la documentazione Msdn:
    Template

    Quote Originariamente inviato da Jedi-78 Visualizza il messaggio
    Con il codice che ho copiato sopra, per esempio, come faccio a capire al .NET a quale campo -del database Guestbook- deve fare il Binding?
    Le proprietà DataTextField e DataValueField consentono di settare il campo dell'origine dati fornendo rispettivamente il testo e il valore dell'item.

    Per quanto riguarda l'ultimo errore, esegui un debug passo passo e verifica che entri nel ramo di if (visto l'errore secondo me non entra).

  7. #7
    L'avatar di Jedi-78
    Jedi-78 non è in linea Novello
    Post
    32
    Finalmente dopo mille tentativi ho capito in cosa sbagliavo per quanto riguarda l'ID...

    Dovete perdonarmi ma sono troppo legato al buon Access con il campo 'Contatore'.

    Avevo dimenticato di impostare l'ID della Guestbook ad una variabile autoincrementale.
    Ultima modifica di Jedi-78; 30-03-2009 16:47 
    No. Try not. Do. Or do NOT! There's no TRY! (Master Yoda)

  8. #8
    L'avatar di Jedi-78
    Jedi-78 non è in linea Novello
    Post
    32
    Ancora due domandine su Guestbook.

    Ora che il campo Data viene caricato...

    che tipo di conversione e formato SQL devo attivare affinché non solo la data ma anche l'ora venga inserita?

    codice:
    
    e.Command.Parameters("@Data").Value = DateTime.Now.ToLongTimeString
    
    E.... la dropdownlist come vi accedo per impostare il default?

    codice:
    
    IfNot Page.IsPostBack Then
    ddProv.SelectedValue = "VA"
    EndIf
    
    con la DropDownList esterna funziona...

    codice:
     <asp:DetailsView Height="190px" BorderStyle=None Width="560px" ID="dvGuestbook" runat="server" AutoGenerateRows="False"  AutoGenerateInsertButton=True
            DataKeyNames="ID" DataSourceID="sqlGuestbook" ondatabound="dvGuestbook_DataBound"
             >
            <FooterTemplate>
                </td>
                </tr>
                </table>
                <!--#include file="~/TabBorderDown.aspx"-->  
            </FooterTemplate>
            <Fields>
            <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" SortExpression="ID" Visible="False" />
                <asp:BoundField DataField="Nome" HeaderText="Nome" SortExpression="Nome" />
                
                <asp:BoundField DataField="Cognome" HeaderText="Cognome" SortExpression="Cognome" />
                <asp:BoundField DataField="Data" HeaderText="Data" SortExpression="Data" visible=false  />
                
                <asp:BoundField DataField="Citta" HeaderText="Citta" SortExpression="Citta" />
                <asp:TemplateField>
                    <EditItemTemplate>
                        <asp:DropDownList SelectedValue='<%# Bind("Prov") %>'  ID="ddProv" runat="server" DataSourceID="sqlTarghe"  DataTextField="Provincia" DataValueField="Targa">
                        </asp:DropDownList>
                    </EditItemTemplate>
                    <InsertItemTemplate>
                        <asp:DropDownList SelectedValue='<%# Bind("Prov") %>' ID="ddProv" runat="server" DataSourceID="sqlTarghe"  DataTextField="Provincia" DataValueField="Targa">
                        </asp:DropDownList>
                    </InsertItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lblProvincia" runat="server" Text='<%# Bind("Prov") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="email" HeaderText="email" SortExpression="email" />
                <asp:BoundField DataField="URL" HeaderText="URL" SortExpression="URL" />
                
                
                <asp:TemplateField SortExpression="Commento">
                    <EditItemTemplate>
                        <FCKeditorV2:FCKeditor id="editCommento" ToolbarSet="News" ToolbarCanCollapse=true BasePath="~/FCKeditor/" Value='<%# Bind("Commento") %>' runat="server" />
                    </EditItemTemplate>
                    <InsertItemTemplate>
                        <FCKeditorV2:FCKeditor id="editCommento" ToolbarSet="News" ToolbarCanCollapse=true BasePath="~/FCKeditor/" Value='<%# Bind("Commento") %>' runat="server" />
                    </InsertItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="lblCommento" runat="server" Text='<%# Bind("Commento") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Fields>
            <HeaderTemplate>
                
                <!--#include file="~/TabBorderUpFix.aspx"--> 
                <table><tr><td>
            </HeaderTemplate>
        </asp:DetailsView>
    Per recuperare il 'ddProv' che è parte di 'dvGuestbook', come ricavo l'handler o meglio ancora, come ne setto il valore di default?
    No. Try not. Do. Or do NOT! There's no TRY! (Master Yoda)

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi