2009-07-09 5 views
14

Come posso ottenere DateTime valore in C# dalla fila, il codice attuale mi sta dando errore ogni aiuto è apprezzato, il dato è in arrivo dal database corso:Recupero di un valore DateTime da un DataRow (C#)

foreach (DataRow r in ds.Tables[0].Rows) 
{ 
    string prodCode = r["PRD-CDE"].ToString(); 
    statCode = r["STAT"].ToString(); 
    DateTime firstIssueDate = (DateTime)(r["FISS"]); 
    DateTime endIssueDate = (DateTime)(r["EISS"]); 
    if(endIssueDate > DateTime.Now) 
    { /*do some thing...*/} 
    else {/*user invalid...*/} 
} 

ci sono due modi utilizzati per ottenere la data di convertire e pars, grazie a tutti per l'aiuto

finale frammento di codice di lavoro:

foreach (DataRow r in ds.Tables[0].Rows) 
      { 
       string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString(); 
       // r.<DateTime?>("FISS"); 
       if (r["FISS"] != DBNull.Value) 
       { 
        DateTime firstIssueDate = Convert.ToDateTime(r["FISS"]); 
        if (r["EISS"] != DBNull.Value) 
        { 
         DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString()); 
         if (endIssueDate > DateTime.Now) 
         { 
+0

eventuali messaggi di errore che si stanno ottenendo potrebbe aiutare . – geofflane

+0

Qual'è il tipo di dati della colonna nel set di dati? È SQL DateTime? –

+0

è una colonna di dati in corso nella banca dati – Developer

risposta

36

Questa è solo una supposizione, ma se il tipo corrispondente nel database è DateTime, potrebbe controllare se la colonna è nullable?

In tal caso, è possibile effettuare un controllo r["column"] == DBNull.Value e quindi passarlo a un valore DateTime nullable? Campo.

O ancora più semplice:

row.Field<DateTime?>("column") 

Se non lo è allora sì, Convert.ToDateTime() o qualcosa d'altro dovrebbe farlo.

EDIT:

vedo il tuo codice finale lì, ma c'è qualche possibilità che si vuole fare questo:.

DateTime? firstIssueDate = r.Field<DateTime?>("fiss"); 
DateTime? endIssueDate = r.Field<DateTime?>("eiss"); 

if (firstIssueDate.HasValue && endIssueDate.HasValue) 
{ 
    firstIssueDate.Value // blah blah 
    endIssueDate.Value // blah blah 
} 
+0

if (r ["FISS"] == DBNull.Value) questo ha fatto sì è un valore nullo, sta ancora testando :) Grazie – Developer

+0

Ho visto il tuo codice e ho aggiunto alcuni suggerimenti nell '"EDIT" porzione. Cosa ne pensi? –

+2

Non ho mai visto il metodo .Field <> usato .. Nice +1 – NotMe

11

Si consiglia di utilizzare DateTime.Parse() se la riga restituisce una stringa per tale indice.

string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString(); 
DateTime firstIssueDate = DateTime.Parse(r["FISS"].ToString()); 
DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString()); 

È inoltre possibile utilizzare TryParse in base alle proprie esigenze.

+0

Errore: Argomento '1': impossibile convertire da 'oggetto' a 'stringa' \t dopo aver eseguito il seguente codice: DateTime firstIssueDate = DateTime.Parse (r ["FISS"]); provato anche: DateTime firstIssueDate = DateTime.Parse (r ["FISS"]. ToString()); Errore: ex = {"La stringa non è stata riconosciuta come un DateTime valido."} – Developer

+0

Esiste un modo per mostrarci cosa è ["FISS"]. ToString()? Forse è un tipo nullable come qualcuno ha menzionato. –

0

come una risposta lato, è possibile utilizzare anche la funzione statica Convert.ToDateTime

0

DateTime.Parse (r [ "FISS"] ToString()) è la strada da percorrere, ma genera un errore "String non è stato riconosciuto come un DateTime valido". Potrebbe mostrare la stringa effettiva nel settore della R [ "FISS"] colonna, potrebbe essere un problema di internazionalizzazione ....

2
foreach (DataRow r in ds.Tables[0].Rows) 
{ 
    string prodCode = r["PRD-CDE"].ToString(); 
    string statCode = r["STAT"].ToString(); 
    DateTime firstIssueDate = DateTime.Parse((r["FISS"]).ToString()); 
    DateTime endIssueDate = DateTime.Parse((r["EISS"]).ToString()); 
    if(endIssueDate > DateTime.Now) 
    { /*do some thing...*/} 
    else {/*user invalid...*/} 
} 

Questo dovrebbe compilare e può funzionare per voi. Anche se non sta eseguendo alcun controllo degli errori che dovresti fare per il codice di produzione. Date un'occhiata a DateTime.TryParse e potreste esaminare l'aggiunta di un IFormatProvider per garantire che il formato sia analizzato come previsto.

1

Prima di tutto, fare r [ "FISS"]. GetType() e stamparlo per consolare (o mettere in pausa e guardare nel debugger). Se dice che è una stringa, allora la maggior parte dei consigli di cui sopra aiuterà. Se dice qualcos'altro, per favore torna indietro e aggiorna la tua domanda.

4

Se si desidera utilizzare un valore predefinito (come DateTime.MinValue), piuttosto che null (? DateTime) o DBNull, si potrebbe fare questo:

var firstIssueDate = r["FISS"] as DateTime? ?? DateTime.MinValue; 
var endIssueDate = r["EISS"] as DateTime? ?? DateTime.MinValue;