2009-07-09 9 views
14

Comment puis-je obtenir la valeur DateTime en C# de la ligne, le code actuel me donne erreur de toute aide est appréciée, les données proviennent de la base de données de progression:Récupération d'une valeur DateTime d'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...*/} 
} 

il y a deux façons utilisées pour obtenir la date et convert pars, je vous remercie 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) 
         { 
+0

Tous les messages d'erreur que vous obtenez pourrait aider . – geofflane

+0

Quel est le type de données de la colonne dans l'ensemble de données? Est-ce SQL DateTime? –

+0

c'est une colonne de date dans la base de données en cours – Developer

Répondre

36

Ceci 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 annulable?

Si oui, vous pouvez faire un contrôle r["column"] == DBNull.Value, puis le passer à un DateTime Nullable? Champ.

Ou encore plus facile:

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

Si ce n'est pas alors oui, Convert.ToDateTime() ou quelque chose d'autre doit le faire.

EDIT:

Je vois là votre code finale, mais est-il une chance que vous voulez 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 
} 
+0

si (r ["FISS"] == DBNull.Value) celui-ci l'a fait oui c'est une valeur nulle, encore en test :) Merci – Developer

+0

J'ai vu votre code et j'ai ajouté quelques suggestions dans le 'EDIT' portion. Qu'est-ce que tu penses? –

+2

Je n'ai jamais vu la méthode .Field <> utilisée. Nice +1 – NotMe

11

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 en fonction de vos besoins.

+0

Erreur: Argument '1': impossible de convertir 'objet' en 'chaîne' \t après avoir tyrié le code suivant: DateTime firstIssueDate = DateTime.Parse (r ["FISS"]); même essayé: DateTime firstIssueDate = DateTime.Parse (r ["FISS"]. ToString()); Erreur: ex = {"Chaîne n'a pas été reconnue comme un DateTime valide."} – Developer

+0

Est-il possible de nous montrer à quoi ressemble r ["FISS"]. ToString()? Peut-être que c'est un type nullable comme quelqu'un l'a mentionné. –

0

En réponse côté, vous pouvez également utiliser la fonction statique Convert.ToDateTime

0

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

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

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

1

tout d'abord, faire r [ "Fiss"]. GetType() et l'imprimer à la console (ou mettre en pause et de regarder dans le débogueur). S'il dit que c'est une chaîne, alors la plupart des conseils ci-dessus vous aideront. S'il y a autre chose, veuillez revenir et mettre à jour votre question.

4

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

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