2013-01-02 9 views
14

Ho unito le stesse due tabelle due volte utilizzando diversi alias in una query SQL per consentirmi di selezionare 2 (potenzialmente ma non sempre) ID di indirizzi diversi che poi collegano nella tabella degli indirizzi.Differenziazione tra 2 nomi di colonne SQL con lo stesso nome in C# SqlConnection

SELECT C.court_id, C.court_name, CA.court_address, CA2.court_address... 
FROM court C " + 
JOIN court_addr CA ON C.court_addr_id = CA.court_addr_id " + 
JOIN court_addr CA2 ON C.court_postal_addr_id = CA2.court_addr_id " + ... 

Ora, quando si cerca di produrre i risultati di questa query utilizzando ASP.NET C# io sono sicuro come specificare quale dei due indirizzi a Response.Write. Mettere l'alias davanti al nome della colonna (come nel 4 ° valore di stringa sotto) non funziona e fa apparire un errore. C'è un modo di differenziare tra i due indirizzi in C# nonostante abbiano entrambi lo stesso nome di colonna nel database?

while (myDataReader.Read()) 
{ 
    string court_id = myDataReader["court_id"].ToString(); 
    string court_name = myDataReader["court_name"].ToString(); 
    string court_address = myDataReader["court_address"].ToString(); 
    string court_postal_address = myDataReader["CA2.court_address"].ToString(); 
    etc..... 

Ringraziandovi muchly in anticipo

risposta

32

Si dovrebbe utilizzare un alias in SQL per distinguerli, allora si sarà in grado di restituire il valore corretto:

SELECT C.court_id, 
    C.court_name, 
    CA.court_address as CACourtAddress, 
    CA2.court_address as CA2CourtAddress 
FROM court C " + 
JOIN court_addr CA ON C.court_addr_id = CA.court_addr_id " + 
JOIN court_addr CA2 ON C.court_postal_addr_id = CA2.court_addr_id " + ... 
+0

Eccellente, grazie. E soprattutto per la risposta molto veloce. Ho lavorato a meraviglia e posso usare lo stesso principio su altre colonne che potrebbero dover apparire più di una volta. –

+0

@DanSolo - L'uso di un alias significativo dovrebbe aiutare a semplificare la vita. Ad esempio, se il primo 'JOIN' è quello di individuare la Corte d'Appello (IANAL.) Quindi utilizzare' CourtOfAppeals' o 'CoA' piuttosto che' CA2' per l'alias. Generalmente utilizzo un punto negli alias di colonne per separare l'alias di tabella dal nome della colonna, ad es. 'CoA.Court_Name'. – HABO

2

si poteva accedere al colonne per indice se non è possibile modificare la query.

var foo = MyDataReader[0].ToString(); 

Oppure si potrebbe modificare la query utilizzando la parola chiave AS nell'istruzione SQL.

SELECT foo AS bar FROM Baz 
0

Oltre a fornire un alias nome colonna come suggerisce bluefeet, un altro modo sarebbe quello di accedere ai valori dell'indice anziché per nome in C#.

string theValue = myReader[0] as string ?? String.Empty; 

Questo, tuttavia, richiede che l'ordine delle colonne non cambi mai e deve quindi essere usato con attenzione. Inoltre, questo funziona solo se si selezionano specificamente le colonne per nome nell'ordine specificato nell'istruzione SQL.

Questo potrebbe non funzionare per un SELECT *, poiché l'ordine delle colonne restituite non è stato risolto in un SELECT *.

+0

Potrei continuare a ripetermi, ma * perché il downvote *? –

+0

Rimosso il downvote poiché la risposta è una soluzione valida se la situazione ne garantisce l'utilizzo. –

3

Si dovrebbe utilizzare il nome alias per distinguere due colonne con lo stesso nome come:

SELECT C.court_id, C.court_name, CA.court_address CourtAddress, CA2.court_address CourtPostalAddress FROM court C 
JOIN court_addr CA ON C.court_addr_id = CA.court_addr_id 
JOIN court_addr CA2 ON C.court_postal_addr_id = CA2.court_addr_id 

E poi in C# è possibile accedervi facilmente:

string court_id = myDataReader["court_id"].ToString(); 
string court_name = myDataReader["court_name"].ToString(); 
string court_address = myDataReader["CourtAddress"].ToString(); 
string court_postal_address = myDataReader["CourtPostalAddress"].ToString(); 

Spero che questo aiuta a risolvere il tuo problema :)

Problemi correlati