select multiple con entity sql
-
giovedì 15 marzo 2012 18:14
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?
Tutte le risposte
-
giovedì 15 marzo 2012 19:25
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- Modificato Marco MinervaMicrosoft Community Contributor giovedì 15 marzo 2012 19:25
-
venerdì 16 marzo 2012 18:06
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 19:52
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- Modificato Marco MinervaMicrosoft Community Contributor venerdì 16 marzo 2012 21:35
-
domenica 18 marzo 2012 10:13
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 11:36Dopo 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:47
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 12:07
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:16
è 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:42
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:48
si, commentando quelle righe mi appare la label nella formview con il dato corretto
-
domenica 18 marzo 2012 13:08
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:28
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:58Lo 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 22:03
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 Usingsolo 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 23:01
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 -
lunedì 19 marzo 2012 17:44
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 Usingperche mi da errore
Metodo GetSchemaTable non supportato.
-
lunedì 19 marzo 2012 18:08
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 UsingMarco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
lunedì 19 marzo 2012 18:12
stavo proprio provando in questo momento ma il risultato è lo stesso
Metodo GetSchemaTable non supportato.
-
lunedì 19 marzo 2012 18:18
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:23ok grazie ora do un'occhiata e vedo se riesco a risolvere il mio problema

