Получение значения DateTime из DataRow (С#)

Как я могу получить значение DateTime в С# из строки, текущий код дает мне ошибку любая помощь приветствуется, данные поступают из базы данных выполнения:

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

существует два способа использования конвертации даты и пар, спасибо вам за помощь

Окончательный рабочий фрагмент кода:

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

Ответы

Ответ 1

Это просто предположение, но если соответствующий тип в базе данных - DateTime, можете ли вы проверить, является ли столбец допустимым?

Если это так, вы можете сделать чек r["column"] == DBNull.Value, а затем передать его в NULL DateTime? Поле.

Или еще проще:

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

Если это не так, да, Convert.ToDateTime() или что-то еще должно это сделать.

EDIT:

Я вижу ваш окончательный код там, но есть ли шанс, что вы хотите это сделать:

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 
}

Ответ 2

Я бы рекомендовал использовать DateTime.Parse(), если строка возвращает строку для этого индекса.

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

Вы также можете использовать TryParse в зависимости от ваших потребностей.

Ответ 3

Если вы хотите использовать значение по умолчанию (например, DateTime.MinValue), а не null (DateTime?) или DBNull, вы можете сделать это:

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

Ответ 4

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

Это должно компилироваться и работать для вас. Хотя он, конечно, не выполняет никаких проверок ошибок, которые вы должны делать для производственного кода. Также посмотрите в DateTime.TryParse, и вы можете посмотреть на добавление IFormatProvider, чтобы убедиться, что формат анализируется, как ожидалось.

Ответ 5

Прежде всего, сделайте r [ "FISS" ]. GetType() и распечатайте его на консоли (или остановитесь и посмотрите на него в отладчике). Если он говорит, что это String, то большинство из приведенных выше советов помогут. Если он говорит что-то еще, вернитесь и уточните свой вопрос.

Ответ 6

В качестве побочного ответа вы можете также использовать статическую функцию Convert.ToDateTime

Ответ 7

DateTime.Parse(r [ "FISS" ]. ToString()) - это путь, но он выдает ошибку "String не был признан допустимой DateTime". Не могли бы вы показать фактическую строку в столбце r [ "FISS" ], это может быть проблемой интернационализации....

Ответ 8

Если у вас есть строка DateTime со специальным форматом (не стандартный формат .NET DateTime), который необходимо преобразовать в тип .NET DateTime, вы можете использовать метод DateTime.ParseExact().

Подробнее см. документ MSDN, включая примеры.

Если у вас есть несколько форматов для синтаксического анализа, попробуйте DateTime.ParseExact Method (String, String [], IFormatProvider, DateTimeStyles)