2016-04-12 2 views
0

Ich habe diesen Code bekam:Wie kann ich sicher eine Null zurückgeben, wenn ein ungültiger Datensatz gefunden wird?

private static QueuedReports GetSingleReportForUnit(string unit, int RptID, DateTime nextExDate) 
{ 
    ReportSchedule rs = ReportSchedulerSQL.GetReportSchedulerRecord(unit, RptID); 
    DateTime d8 = new DateTime(0001, 1, 1); //DateTime.Now.AddYears(1); 
    if (rs.NextExecution.Date == d8.Date) 
    { 
     ;// return null; <= I get, "cannot access a closed stream" with this 
    } 
    QueuedReports qr = new QueuedReports(); 
    qr.Unit = unit; 
    qr.ReportName = GetReportNameForID(RptID); 
    List<String> emailAddresses = ReportSchedulerSQL.GetEmailAddressesForUnitRpt(unit, RptID); 
    qr.AllEmailAddresses = string.Join(",", emailAddresses.ToArray()); 
    qr.NextExecution = nextExDate; 
    qr.NextExecutionsBeginDateArg = GetNextExecutionsBeginDateArg(unit, RptID, nextExDate); 
    qr.NextExecutionsEndDateArg = GetNextExecutionsEndDateArg(unit, RptID, nextExDate); 
    return qr; 
} 

..., die sich von hier genannt:

private static IEnumerable<QueuedReports> GetAllFutureReportsForUnit(string unit, int RptID, DateTime finalDate) 
{ 
    List<QueuedReports> listToReturn = new List<QueuedReports>(); 
    DateTime currentDate = DateTime.Now; 
    while (currentDate <= finalDate) 
    { 
     currentDate = ReportSchedulerConstsAndUtils.GetNextDateForUnitReportAfter(unit, RptID, currentDate); 
     var qr = GetSingleReportForUnit(unit, RptID, currentDate); 
     listToReturn.Add(qr); 
    } 
    return listToReturn; 
} 

Wenn ein gültiger Eintrag in GetSingleReportForUnit() gefunden wird, das heißt, ein " NextExecution "mit einem anderen Wert als" 0001, 1, 1 ", alles ist gut; Wenn dies nicht der Fall ist, wird mein Versuch, null zurückzusenden, aber zur Laufzeit mit "kann nicht auf einen geschlossenen Datenstrom zugreifen" fehlgeschlagen.

Wie kann ich die Ausführung von GetSingleReportForUnit() bei einem ungültigen Datum (1. Januar des Jahres 1) bewohnt rs.NextExecution?

QueuedReports ist eine benutzerdefinierte Klasse:

public class QueuedReports 
{ 
    public string Unit { get; set; } 
    public string ReportName { get; set; } 
    public DateTime NextExecution { get; set; } 
    public string AllEmailAddresses { get; set; } 
    public DateTime NextExecutionsBeginDateArg { get; set; } 
    public DateTime NextExecutionsEndDateArg { get; set; } 
} 

Warum sollte der Akt der Null Versuch der Rückkehr einen Stream zugreifen? AFAICT, es gibt keinen Stream in diesem Code, also WTH?

+1

Können Sie den Stack-Trace veröffentlichen? –

Antwort

1

Das hängt davon ab, was rs.NextExecution tut und wie es funktioniert. Wenn dort eine Art von Stream geöffnet wird und das Objekt mit der Date-Eigenschaft nicht zurückgegeben werden kann, funktioniert Ihre if-Anweisung nicht.

Sie können einen try catch-Block verwenden, um jede ausgelöste Ausnahme abzufangen und null innerhalb des catch-Anweisungsblocks zurückzugeben. Sie können überprüfen, ob der Stream innerhalb dieses NextExecution-Objekts noch gültig ist, anstatt die date-Eigenschaft zu überprüfen, falls diese verfügbar ist.

2

Ich glaube, Sie suchen continue:

private static IEnumerable<QueuedReports> GetAllFutureReportsForUnit(string unit, int RptID, DateTime finalDate) 
{ 
    List<QueuedReports> listToReturn = new List<QueuedReports>(); 
    DateTime currentDate = DateTime.Now; 
    while (currentDate <= finalDate) 
    { 
     currentDate = ReportSchedulerConstsAndUtils.GetNextDateForUnitReportAfter(unit, RptID, currentDate); 
     if (currentDate == DateTime.MinValue) 
      continue; 
     var qr = GetSingleReportForUnit(unit, RptID, currentDate); 
     listToReturn.Add(qr); 
    } 
    return listToReturn; 
} 

Wenn Ihr current ist der 1. Januar des Jahres 1, dann wird weiterhin die Steuerung an die nächste Iteration des while-Schleife übergeben.

Verwandte Themen