none
select multiple con entity sql

    Discussione generale

  • salve a tutti sto cercando di fare una select multipla in questo modo

       Dim esqlQuery As String = "SELECT entity.dato1, entity.dato2, entity.dato3 FROM DatabaseEntities.entityes as entity; SELECT entity.dato4 FROM FROM DatabaseEntities.entityes as entity"

       mi da l'errore di sintassi vicino alla parola chiave select

    dove è l'errore e come posso sciverla in modo corretto?  

    giovedì 15 marzo 2012 18:14

Tutte le risposte

  • Nella seconda SELECT hai scritto due volte la parola chiave FROM.

    A parte l'errore, perché stai cercando di fare questa cosa? Non puoi semplicemente inserire tutti i campi nella stessa SELECT? Anche perché, eseguendo questo comando, otterresti solo il risultato della seconda SELECT (che tra l'altro restituisce un numero di campi diversi dalla prima).


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    giovedì 15 marzo 2012 19:25
  • si, i due from sono un errore che ho fatto nello scrivere il codice nel post

    comunque quello che cerco di fare è questo

    Using conn As New EntityConnection("name=DatabaseEntities")

                conn.Open()

    Dim esqlQuery As String = "SELECT entity.dato1, entity.dato2, entity.dato3 FROM DatabaseEntities.entityes as entity; SELECT entity.dato4  FROM DatabaseEntities.entityes as entity"

                Using cmd As New EntityCommand(esqlQuery, conn)
                    Using rdr As DbDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
                   rdr.Read()

    Label1.Text = rdr("dato1")

                    Label2.Text = rdr("dato2")

      Label3.Text = rdr("dato3")

     rdr,nextresult()

    fromview1.datasource=rdr

    fromview1.databind() 

    end using

    conn.close()

    end using

    avrei bisogno di assegnare al formview solo la seconda select della query ma la query scritta in questo modo mi da errore di sintassi

    venerdì 16 marzo 2012 18:06
  • Mi dici qual è il messaggio di errore che ottieni?

    Ad ogni modo, ripeto il mio consiglio, perché non metti tutto nella stessa SELECT, dal momento che stai interrogando la stessa tabella? Visto che alla FormView vuoi assegnare solo la seconda SELECT, ovvero l'unico campo dato4, basta che definisci nel suo template solo il bind per tale campo, e il gioco è fatto.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    venerdì 16 marzo 2012 19:52
  • si, hai ragione stavo solamente complicando le cose

    allora ho provato ad utilizzare il metodo bind ma ancora la formview rimane vuota 

    questo è l'itemtemplate della formview

    <div style=" left:0;">

    Marca: <asp:Label ID="dato4" runat="server" 
              Text='<%# bind("dato4") %>'>
          </asp:Label>
    <br />

    </div>

    e questo il codice

    Dim esqlQuery As String = "SELECT entity.dato1, entity.dato2, entity.dato3, entity.dato4 FROM DatabaseEntities.entityes as entity"

      Using cmd As New EntityCommand(esqlQuery, conn)
                    Using rdr As DbDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
                   rdr.Read()

       Label1.Text = rdr("dato1")

       Label2.Text = rdr("dato2")

       Label3.Text = rdr("dato3")

    fromview1.datasource=rdr

     
    domenica 18 marzo 2012 10:13
  • Dopo che hai impostato il DataSource del FormView, devi richiamare il metodo DataBind sull'oggetto: http://msdn.microsoft.com/it-it/library/zd7t67ef.aspx.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 18 marzo 2012 11:36
  • niente, il formview continua a rimanere vuoto ho provato anche cosi

     <div class="form">
                        <asp:FormView ID="FormView1" runat="server">
                            <ItemTemplate>
                                <asp:label ID="Label3" runat="server" Text='<%# bind("dato4") %>'></asp:label>
                            </ItemTemplate>
                        </asp:FormView>
                    </div>

     Using conn As New EntityConnection("name=DatabaseEntities")
                conn.Open()

    Dim esqlQuery As String = "SELECT entity.dato1, entity.dato2, entity.dato3, entity.dato4 FROM DatabaseEntities.entityes as entity"

      Using cmd As New EntityCommand(esqlQuery, conn)
                   

    Using rdr As DbDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)

                   rdr.Read()

       Label1.Text = rdr("dato1")

       Label2.Text = rdr("dato2")

       Label3.Text = rdr("dato3")

    fromview1.datasource=rdr

    formview1.databind()

    end using

    end using

    conn.close()

    end using

    domenica 18 marzo 2012 11:47
  • Molto strano, ho provato io stesso e il valore viene visualizzato correttamente.

    Se provi a mostrare rdr("dato4") in una Label (come fai per gli altri dati), riesci a vedere il valore?


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 18 marzo 2012 12:07
  • è proprio questo che non riesco a capire, ho fatto la prova piu volte e se provo a visualizzare lo stesso dato in una label lo visualizzo correttamente

    inoltre ho notato che nel codice dal browser la label nel formview proprio non compare 

    <div class="form"> <table cellspacing="0" id="FormView1" style="border-collapse:collapse;"> </table>

    </div>

     
    domenica 18 marzo 2012 12:16
  • Ho nuovamente ricreato il tuo scenario, ma tutto funziona a dovere. L'unica differenza è che io ho utilizzato un SqlDataReader per il test.

    Prova a commentare queste righe:

    rdr.Read() 
    Label1.Text = rdr("dato1") 
    Label2.Text = rdr("dato2") 
    Label3.Text = rdr("dato3")
    

    Lasciando in pratica solo il bind della FormView. Vediamo se così appare qualcosa.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 18 marzo 2012 12:42
  • si, commentando quelle righe mi appare la label nella formview con il dato corretto

    domenica 18 marzo 2012 12:48
  • Sembra allora che non sia possibile usare una modalità "mista", ovvero leggere alcuni dati esplicitamente con rdr("nomecampo") ed effettuare il bind di altri in un controllo come il FormView.

    C'è un motivo particolare per cui stai usando un EntityCommand, anziché ricorrere alla sintassi LINQ-To-Entities?


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 18 marzo 2012 13:08
  • si, utilizzo EntityCommand perche ho bisogno di utilizzare la query in formato stringa perche la formview ha diversi template che possono cambiare a seconda dei casi, in pratica piu o meno il concetto dovrebbe essere questo

    function metodo (byval entita as string) as string

    dim query as string

    select case entita

    case "entita1"

    query="dato4"

    case "entita2"

    query="dato5, dato6"

    case ...

    end select

    return query

    end function

    dim entita as string =ddl.selectedvalue

    dim dati_fromview as string = function(entita)

    Dim esqlQuery As String = "SELECT entity.dato1, entity.dato2, entity.dato3," & dati_fromview & " FROM DatabaseEntities.entityes as entity"

    e da questo punto inserire dato1, dato2, dato3 nelle label ed la parte ritornata dalla function viene inserita nella formview che tramite nell'evento init con loadtemplate  carica il template corrispondente

    potrei anche utilizzare un entitydatasource per riempire la formview ed utilizzare il dbDatareader per i vari controlli, ma mi piaceva l'idea di fare tutto cio con un solo accesso al database utilizzando dbDatareader

    domenica 18 marzo 2012 13:28
  • Lo puoi fare comunque, ti basta salvare all'interno di un tuo oggetto il risultato del datareader, in modo che tu lo possa usare dove ne hai bisogno (ovvero, nelle Label piuttosto che nella FormView).

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 18 marzo 2012 13:58
  • ma, visto che ogni entita ha un numero di proprieta diverse, dovrei crearmi un oggetto diverso per ogni entita oppure utilizzare un datatable?

    oppure potrei utilizzare il codice in questo modo come avevo provato in precedenza

     Using conn As New EntityConnection("name=DatabaseEntities")
                conn.Open()
                Dim esqlQuery As String = "SELECT entity.dato1, entity.dato2, entity.dato3 FROM DatabaseEntities.entities as entity; SELECT entity.dato4 FROM DatabaseEntities.entities as entity"
                Using cmd As New EntityCommand(esqlQuery, conn)
                    Using rdr As DbDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
                        rdr.Read()
                        Label4.Text = rdr("dato1")
                        Label5.Text = rdr("dato2")
                        Label6.Text = rdr("dato3")
                        FormView1.DataSource = rdr.NextResult
                        FormView1.DataBind()
                    End Using
                End Using
                conn.Close()
            End Using

    solo che questo mi da errore e non capisco perchè visto che la procedura che utilizzo mi sembra la stessa decritta in http://msdn.microsoft.com/it-it/library/aa720705(v=vs.71).aspx

    La sintassi della query non è valida. Vicino parola chiave 'SELECT', riga 1, colonna 91.

    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 la traccia dello stack. 

    Dettagli eccezione: System.Data.EntitySqlException: La sintassi della query non è valida. Vicino parola chiave 'SELECT', riga 1, colonna 91.


    domenica 18 marzo 2012 22:03
  • Tutti gli esempi che si trovano in rete parlano del supporto a più result set Entity Framework solo se si utilizzano stored procedure. Il tuo scenario non sembra supportato.

    Ti basta fare una ricerca su Google con l'espressione "entity framework multiple result sets" per trovare numerosi articoli sull'argomento.

    Direi quindi che, nel tuo caso, devi usare una sola SELECT ed inserire i dati recuperati in un DataTable.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    domenica 18 marzo 2012 23:01
  • scusami lo so che sono insistente ma per creare un DataTable da un BdDataReader no si usa il metodo GetSchemaTable?

      Using conn As New EntityConnection("name=DatabaseEntities")
                conn.Open()

                Dim esqlQuery As String = "SELECT entity.dato1, entity.dato2, entity.dato3, entity.dato4 FROM DatabaseEntities.entities as entity"

                Using cmd As New EntityCommand(esqlQuery, conn)

                    Using rdr As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)

                        rdr.Read()

                        Dim dt As New DataTable
                        dt = rdr.GetSchemaTable()

                    End Using
                End Using
                conn.Close()
            End Using

    perche mi da errore 

    Metodo GetSchemaTable non supportato.

    lunedì 19 marzo 2012 17:44
  • GetSchemaTable, come dice il nome stesso, restituisce solo lo schema della tabella, non i dati.

    Nel tuo caso, invece, devi usare il metodo Load del DataTable:

    Using rdr As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
     
        Dim dt As New DataTable
        dt.Load(rdr)
    
    End Using
     
    


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 19 marzo 2012 18:08
  • stavo proprio provando in questo momento ma il risultato è lo stesso

    Metodo GetSchemaTable non supportato.

    lunedì 19 marzo 2012 18:12
  • Purtroppo sto verificando che ottenere un DataTable da un EntityDataReader non è così immediato.

    Dai un'occhiata a questo post: http://blogs.msdn.com/b/alexj/archive/2007/11/28/hydrating-a-datatable-from-an-entitydatareader-part-2.aspx, troverai un modo per ottenere ciò che ti serve.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 19 marzo 2012 18:18
  • ok grazie ora do un'occhiata e vedo se riesco a risolvere il mio problema
    lunedì 19 marzo 2012 18:23