2015-02-04 10 views
13
DataTable dt = ds.Tables[4].AsEnumerable() 
    .Where(x => ((DateTime)x["EndDate"]).Date >= DateTime.Now.Date) 
    .CopyToDataTable(); 

ds.Tables[4] ha righe ma genera l'eccezioneLa fonte non contiene DataRow

"La fonte non contiene DataRow."

Qualche idea su come gestire o sbarazzarsi di questa eccezione?

+0

Giusto per essere sicuri, vuoi solo le voci che sono per oggi o un giorno in futuro? – ryanyuyu

+0

si verifica perché nessun record corrisponde o riempie completamente la condizione della query e il risultato è nullo quindi qui sto tentando di copiare null in datatable ... – Mike

+0

quando si inserisce DataTable non è possibile modificare la query in relazione allo sql utilizzato per popolare il DataTable iniziale ..? anche se dovessi cambiare l'espressione labda in una query Linq ... hai pensato anche a questo https://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable%28v=vs .110% 29.aspx || https://msdn.microsoft.com/en-us/library/bb386921%28v=vs.110%29.aspx || http://forums.asp.net/t/1557426.aspx?query+CopyToDataTable+does+not+work+when+select+new+is+used – MethodMan

risposta

21

ds.Tables[4] potrebbe, ma il risultato del tuo linq-query potrebbe non, che è probabile dove viene gettata l'eccezione. Dividi il tuo metodo di concatenamento per utilizzare i parametri intermedi in modo da poter essere certo di dove si sta verificando l'errore. Ti aiuterà anche a controllare le righe esistenti prima di chiamare CopyToDataTable() e evitando l'eccezione.

Qualcosa di simile

DataTable dt = null; 
var rows = ds.Tables[4].AsEnumerable() 
    .Where(x => ((DateTime)x["EndDate"]).Date >= DateTime.Now.Date); 

if (rows.Any()) 
    dt = rows.CopyToDataTable(); 

Un'altra opzione è quella di utilizzare la funzione ImportRow su una scissione DataTable

DataTable dt = ds.Tables[4].Clone(); 
var rows = ds.Tables[4].AsEnumerable() 
    .Where(x => ((DateTime)x["EndDate"]).Date >= DateTime.Now.Date); 

foreach (var row in rows) 
    dt.ImportRow(row); 
+0

si verifica perché nessun record corrisponde o riempie completamente la condizione della query e risultato è nullo quindi qui sto cercando di copiare null a datatable. – Mike

+0

@Mike Come ho detto prima, dividere la catena del metodo e controllare i risultati intermedi è un modo per andare. I commenti sulla tua domanda ne hanno suggerito un altro. –

+0

ha già provato questo stesso errore – Mike

3

semplicemente in due linee

var rowSources = ds.Tables[4].AsEnumerable() 
      .Where(x => ((DateTime)x["EndDate"]).Date >= DateTime.Now.Date); 
if(rowSources.Any()) 
{ 
    DataTable dt = rowSources.CopyToDataTable(); 
    ... code that deals with the datatable object 
} 
else 
{ 
    ... error message ? 
} 

Questo permette di verificare se il risultato contiene qualsiasi DataRow, se sì, puoi chiamare la copia Metodo ToDataTable.