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

ds.Tables[4] имеет строки, но он бросает исключениеисточник не содержит DataRows

"Источник не содержит DataRows."

Любая идея, как справиться или избавиться от этого исключения?

+0

Просто убедитесь, что вам нужны только записи, которые есть на сегодня или в будущем? – ryanyuyu

+0

это происходит потому, что никакие записи не соответствуют или не заполняют условие запроса, а результат равен null, поэтому здесь я пытаюсь скопировать значение null в datatable ... – Mike

+0

, когда вы заполняете DataTable, не могли бы вы изменить запрос в отношении sql, используемого для заполнить исходный DataTable ..? также, что, если бы вы изменили выражение labda на запрос Linq .. подумали ли вы об этом также 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

ответ

21

ds.Tables[4] может быть, но результат вашего запроса linq не может быть, что, скорее всего, там, где возникает исключение. Разделите цепочку методов, чтобы использовать промежуточные параметры, чтобы вы могли быть уверены, где ошибка. Это также поможет вам проверить существующие строки перед вызовом CopyToDataTable() и избежать указанным исключением.

Что-то вроде

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

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

Другой вариант заключается в использовании функции ImportRow на 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

это происходит потому, что никакие записи не соответствуют или не заполняют условие запроса и результат равен null, поэтому здесь я пытаюсь скопировать null в datatable. – Mike

+0

@Mike Как я уже сказал, разделение цепочки методов и проверка ваших промежуточных результатов - один из способов. Комментарии по вашему вопросу предложили другое. –

+0

уже пробовал эту же ошибку – Mike

3

Simply расщепления в две строки

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 ? 
} 

Это позволяет проверить, если результат содержит любой DataRow, если да, то вы можете вызвать Копировать Метод ToDataTable.

Смежные вопросы