2015-04-24 9 views
6

Parte della mia applicazione utilizza i nomi delle strade che sono memorizzati in un database SQL. L'applicazione accederà ad ogni record di nome almeno una volta e la maggior parte sarà accessibile più volte. Così ho deciso di caricare i dati dei nomi in un dizionario e quindi cercare di ridurre le letture del database.Perché la ricerca del dizionario fornisce un errore di timeout SQL?

La tabella dei nomi delle strade ha circa 3 milioni di record e io uso il seguente Linq-to-SQL per caricarlo in memoria;

Dictionary<String, DbRoadName> roadNames; 

using (RoutingDataContext dc = new RoutingDataContext(connectionString)) 
{ 
    roadNames = dc.DbRoadNames.ToDictionary(x => x.RoadId); 
} 

Esegue come previsto. L'interruzione del codice a questo punto e il passaggio del mouse sulla variabile roadNames in Visual Studio mostra che il dizionario sembra contenere le coppie chiave-valore previste.

Tuttavia, quando arrivo alla seguente riga più avanti nel programma

DbRoadName roadName = roadNames[lookupId]; 

il programma si ferma con la seguente eccezione

.Net SqlClient Data Provider: Timeout scaduto.

Da quanto ho capito, il metodo ToDictionary() dovrebbe causare la query di database per eseguire, a quel punto, quindi perché mi appare un errore di timeout di SQL alla consultazione dei dizionari?

Aggiornamento: I 'fixed' il problema sostituendo

DbRoadName roadName = roadNames[lookupId]; 

con una dichiarazione TryGetValue. Tuttavia, sono ancora interessato al motivo per cui il dizionario in memoria stava producendo un'eccezione SQL.

+0

I dettagli di tutte le eccezioni (o qualcosa di più del messaggio almeno) potrebbero aiutare – MatteoSp

+0

Wow inserire un nome di roadCountry subito dopo l'utilizzo. La mia ipotesi è un'esecuzione differita. – Paparazzi

+0

@Blam l'ho fatto. Il conteggio mostra il valore corretto ma l'eccezione si verifica ancora nella ricerca. –

risposta

1

per evitare il timeout SQL non caricare il modello di archiviazione nel mio dizionario. Caricare invece i dati As Model con le proprietà necessarie come questa:

Dictionary<String, DbRoadNameModel> roadNameModelDictionary; 
using (RoutingDataContext dc = new RoutingDataContext(connectionString)) 
{ 
    roadNames = dc.DbRoadNames 
     .Select(roadName => new DbRoadNameModel(roadName.RoadId, roadName.Prop1, roadName.Prop2)) 
     .ToDictionary(x => x.RoadId); 
} 

Questo aiuto?

+0

Ho fatto qualcosa di molto simile, con un nuovo poco poco semplice che contiene i dati nel dizionario. Con mia sorpresa, ho ancora ottenuto il timeout SQL all'accesso al dizionario anche se il dizionario non conteneva oggetti di database. –

+0

Hai provato il suggerimento di Steffenn Winkler o Flaudre? Accedi a un elemento dal dizionario all'interno dell'istruzione using. Forse usr ha ragione, e l'eccezione è fuorviante. – gReX

Problemi correlati