Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    query multipla: da ASP a ASP.NET

    Salve a tutti, cerco di spiegare il mio problema. Ho due tabelle (TblTimeTable e TblAeroporti) contenti rispettivamente un piano di volo con partenza (Partenza) e destinazione(Arrivo), e la lista degli aeroporti utilizzati nel piano di volo con la loro posizione (PosizioneX e PosizioneY).
    Ho bisogno di ottenere, per ogni piano di volo, la posizione dell'aeroporto di partenza e quella dell'aeroporto di arrivo.
    In ASP mi basta fare così: apro tre recordset che posso interrogare a piacimento:

    SQL = "SELECT * FROM TblTimeTable order by OraPartenza"
    objrs.Open SQL, objConn

    Do while Not objRs.EOF

    SQLPARTENZA = "SELECT * FROM TblAeroporti WHERE Aeroporto='" & objRs("Partenza") & "'"
    Set objRsPartenza = Server.CreateObject("ADODB.Recordset")
    objRsPartenza.Open SQLPARTENZA, objConn

    inizioX = objRsPartenza("PosizioneX")
    inizioY = objRsPartenza("PosizioneY")
    objRsPartenza.Close

    SQLARRIVO = "SELECT * FROM TblAeroporti WHERE Aeroporto='" & objRs("Arrivo") & "'"
    Set objRsArrivo = Server.CreateObject("ADODB.Recordset")
    objRsArrivo.Open SQLARRIVO, objConn

    fineX = objRsArrivo("PosizioneX")
    fineY = objRsArrivo("PosizioneY")


    Trasformando in ASP.NET (e mi tocca usarlo..), utilizzando gli OLEDBDatareader come sostituti del recordset, incontro un errore del tipo: c'è già un datareader che sta utilizzando la connessione, chiudilo per utilizzarne un altro.
    Ho provato a creare una connessione per ogni datareader, ma l'errore si ripete...Soluzioni?

  2. #2

    Re: query multipla: da ASP a ASP.NET

    Originariamente inviato da chicconew
    ...utilizzando gli OLEDBDatareader come sostituti del recordset, incontro un errore del tipo: c'è già un datareader che sta utilizzando la connessione, chiudilo per utilizzarne un altro.
    Ho provato a creare una connessione per ogni datareader, ma l'errore si ripete...Soluzioni?
    Invece di postare il codice asp forse sarebbe meglio che tu postassi il codice aspx che ti crea problemi. Detto questo, a prima vista mi sembra che stai usando male il datareader. Se devi ottenere dal db dei singoli valori per usarli in una query, non c'e' bisogno di riempire un datareader ma e' piu' appropriato utilizzare un command con il metodo executescalar (che appunto ti restituisce il valore contenuto nel primo campo della query). Oppure se vuoi
    "accedere liberamente" ai records ottenuti da una query dovresti metterli in una datatable che poi potrai utilizzare per fare filtri e leggere il valore che ti interessa senza ogni volta dover interrogare il db.
    Saluti a tutti
    Riccardo

  3. #3
    In entrambi i casi credo che ti convenga estrarre i datio con un'unica query:
    codice:
    SELECT TblTimeTable.* A.PosizioneX as InizioX, A.PosizioneY as InizioY, B.PosizioneX as FineX, B.PosizioneY as FineY
    FROM TblTimeTable as tt 
       inner join TblAeroporti as P
       on(P.Aereoporto=tt.Partenza)
       inner join TblAeroporti as A
       on(A.Aereoporto=tt.Arrivo)
    ORDER BY tt.OraPartenza
    Questa ti mette in relazione la TimeTable con Aereoporti estraendoti posizione di inizio e di fine.


  4. #4
    questa è la pagina aspx

    codice:
    <HTML>
    <BODY>
    <TABLE><TR>
    <%@Import Namespace="System.Data"%>
    <%@Import Namespace="System.Data.OleDb"%>
    
    <%
    
    Dim cn As OleDbConnection
    Dim cmd As OleDbCommand
    Dim cmdPartenza as OleDbCommand
    Dim cmdArrivo as OleDbCommand
    Dim rdr As OleDbDataReader
    Dim rdrPartenza As OleDbDataReader
    Dim rdrArrivo As OleDbDataReader
    
    Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;"& _
    "Data Source="&Server.MapPath("db.mdb")
    
    cn = New OleDbConnection(ConnString)
    
    cn.Open()
    
    Dim sql As String = "SELECT * FROM TblTimeTable ORDER BY OraPartenza"
    cmd = New OleDbCommand(sql, cn)
    rdr = cmd.ExecuteReader()
    While (rdr.Read())
    
    
    Dim sqlPartenza As String = "SELECT * FROM TblAeroporti where Aeroporto=" & rdr("Partenza")
    cmdPartenza = New OleDbCommand(sqlPartenza, cn)
    rdrPartenza = cmdPartenza.ExecuteReader()
    
    
    ' qui mi da errore perchè c'è già rdr aperto!!
    
    
    
    response.write (rdr("Partenza") & "
    ")
    response.write (rdrPartenza("PosizioneX") & ",<TD>" & (rdrPartenza("PosizioneY"))
    
    Dim sqlArrivo As String = "SELECT * FROM TblAeroporti where Aeroporto=" & rdr("Arrivo")
    cmdArrivo = New OleDbCommand(sqlArrivo, cn)
    rdrArrivo = cmdArrivo.ExecuteReader()
    response.write (rdr("Arrivo") & "
    ")
    response.write (rdrArrivo("PosizioneX") & ",<TD>" & (rdrArrivo("PosizioneY"))
    
    
    End While
    
    rdr.Close()
    
    cn.Close()
    
    %>
    
    </TABLE>
    </BODY>
    </HTML>
    per quanto riguarda la query di DeBe99, jet mi restituisce un errore
    "Il modulo di gestione di database Microsoft Jet non riconosce 'TblTimetable.*' come nome di campo o espressione valida."

    NB: immagino che dopo questo campo dovessi inserire una virgola, altrimenti mi dava errore di sintassi

    In ogni modo
    A.PosizioneX as InizioX, A.PosizioneY as InizioY, B.PosizioneX as FineX, B.PosizioneY as FineY

    A e B da dove vengono? non devono essere definite prima?

    Grazie per ancora per l'aiuto che riuscirete a darmi!

  5. #5
    si, dopo l'asterisco mi sono dimenticato una virgola, e B in realtà sarebbe P
    codice:
    SELECT TblTimeTable.*, A.PosizioneX as InizioX, A.PosizioneY as InizioY, P.PosizioneX as FineX, P.PosizioneY as FineY
    FROM TblTimeTable as tt 
       inner join TblAeroporti as P
       on(P.Aereoporto=tt.Partenza)
       inner join TblAeroporti as A
       on(A.Aereoporto=tt.Arrivo)
    ORDER BY tt.OraPartenza
    A e P saltano fuori dalla proposizione FROM (TblAeroporti as A) dove in pratica metto duo volte la tabella TblAeroporti rinominandola (as) una volta come A e una volta come P
    le due proposizioni join invece idicano in che modo queste due tabelle si "collegano" alla prima (P.Aereoporto=tt.Partenza e A.Aereoporto=tt.Arrivo), in questo modo avrai le due tabelle linkate, una con le partenze e una con gli arrivi

  6. #6
    approfitto della tua disponibilità e conoscenza, purtroppo

    Errore di sintassi (operatore mancante) nell'espressione della query '(P.Aereoporto=tt.Partenza) INNER join TblAeroporti as A on(A.Aereoporto=tt.Arrivo)'


  7. #7
    bho, non è che hai scritto "as Pon(on(P.Aereoporto=tt.Partenza)..." invece di "as P on(on(P.Aereoporto=tt.Partenza)..."

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.