web-dev-qa-db-fra.com

Récupération d'une valeur DateTime à partir d'un DataRow (C #)

Comment puis-je obtenir la valeur DateTime en C # à partir de la ligne, le code actuel me donne une erreur, toute aide est appréciée, les données proviennent de la base de données de progression:

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...*/}
}

il y a deux façons d'utiliser la conversion de date et les pars, merci à tous pour l'aide

Extrait de code de travail final:

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)
                        {
18
Developer

C'est juste une supposition mais si le type correspondant dans la base de données est DateTime, pourriez-vous vérifier si la colonne est nullable?

Si c'est le cas, vous voudrez peut-être faire une vérification r["column"] == DBNull.Value puis le transmettre à un DateTime nullable? Champ.

Ou encore plus simple:

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

Si ce n'est pas le cas, oui, Convert.ToDateTime () ou autre chose devrait le faire.

MODIFIER:

J'y vois votre code final, mais y a-t-il une chance que vous souhaitiez le faire:

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 
}
41
Robert Luong

Je recommanderais d'utiliser DateTime.Parse () si la ligne renvoie une chaîne pour cet index.

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

Vous pouvez également utiliser TryParse selon vos besoins.

12
Chris Thompson

Si vous souhaitez utiliser une valeur par défaut (telle que DateTime.MinValue), plutôt que null (DateTime?) Ou DBNull, vous pouvez le faire:

var firstIssueDate = r["FISS"] as DateTime? ?? DateTime.MinValue;
var endIssueDate = r["EISS"] as DateTime? ?? DateTime.MinValue;
5
brianary
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...*/}
}

Cela devrait compiler et peut fonctionner pour vous. Bien qu'il n'effectue certainement aucune vérification d'erreur que vous devriez faire pour le code de production. Examinez également DateTime.TryParse et vous pouvez envisager d'ajouter un IFormatProvider pour vous assurer que le format est analysé comme prévu.

2
Timothy Carter

Tout d'abord, faites r ["FISS"]. GetType () et imprimez-le sur la console (ou faites une pause et regardez-le dans le débogueur). S'il indique qu'il s'agit d'une chaîne, la plupart des conseils ci-dessus vous aideront. S'il indique autre chose, veuillez revenir et mettre à jour votre question.

1
zvolkov

En guise de réponse secondaire, vous pouvez également utiliser la fonction statique Convert.ToDateTime

DateTime.Parse (r ["FISS"]. ToString ()) est le chemin à parcourir, mais il renvoie une erreur "String n'a pas été reconnu comme une DateTime valide". Pourriez-vous montrer la chaîne réelle dans la colonne r ["FISS"], cela pourrait être un problème d'internationalisation ....

0
Colin

Si vous avez une chaîne DateTime avec un format spécial (pas n'importe quel format .NET DateTime standard) qui doit être converti en type .NET DateTime, vous pouvez utiliser la méthode DateTime.ParseExact().

Veuillez consulter le document MSDN pour plus de détails, y compris des exemples.

Si vous avez plusieurs formats à analyser, essayez Méthode DateTime.ParseExact (String, String [], IFormatProvider, DateTimeStyles)

0
Chansik Im