web-dev-qa-db-fra.com

La source ne contient aucun DataRows

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

ds.Tables[4] a des lignes mais il lève l'exception

"La source ne contient aucun DataRows."

Vous avez une idée de comment gérer ou supprimer cette exception?

24
Mike

ds.Tables[4] Pourrait, mais pas le résultat de votre requête linq, ce qui est probablement l'endroit où l'exception est levée. Fractionnez le chaînage de votre méthode pour utiliser des paramètres intermédiaires afin de savoir avec certitude où l'erreur se produit. Cela vous aidera également à vérifier les lignes existantes avant d'appeler CopyToDataTable() et à éviter ladite exception.

Quelque chose comme

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

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

Une autre option consiste à utiliser la fonction ImportRow sur un 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);
35
J. Steen

Diviser simplement en deux lignes

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

Cela permet de vérifier si le résultat contient un DataRow, si oui, vous pouvez appeler la méthode CopyToDataTable.

7
Steve