Как проверить, является ли элемент SQLDataReader значением типа DateTime os String?

У меня есть функция, которая преобразует datareader в CSV. SQL возвращает ГГГГ-ММ-ДД ЧЧ:ММ:СС.000, а .net преобразует его в значение ММ/ДД/ГГГГ. Я хотел бы проверить, является ли значение в средстве чтения данных DateTime и преобразовать его обратно в формат ГГГГ-ММ-ДД ЧЧ:ММ:СС.000.

ОБНОВИТЬ:

Код:

Public Function DR_To_CSV_Stream() As Boolean
    Dim FirstLine As String = ""
    Dim retVal As Boolean

    m_DebugMessage = m_DebugMessage & "DR_To_CSV_Stream: "

    If m_Datareader.Read Then 'CREATE HEADER NAMES
        m_DebugMessage = m_DebugMessage & "CREATE HEADER NAMES: "
        For intcount = 0 To m_Datareader.FieldCount - 1
            If intcount <> m_Datareader.FieldCount - 1 Then
                sw.Write(String.Format("""{0}"",", m_Datareader.GetName(intcount)))
                FirstLine = FirstLine + String.Format("""{0}"",", m_Datareader.Item(intcount))
            Else
                sw.Write(String.Format("""{0}""", m_Datareader.GetName(intcount)))
                FirstLine = FirstLine + String.Format("""{0}""", m_Datareader.Item(intcount))
            End If
        Next
        sw.WriteLine("")
        m_DebugMessage = String.Format("{0}WriteLine(FirstLine): {1}", m_DebugMessage, FirstLine)
        sw.WriteLine(FirstLine)

        Do While m_Datareader.Read() 'READ DATA AND CREATE ROWS
            m_DebugMessage = m_DebugMessage & "READ DATA AND CREATE ROWS: "
            For intcount = 0 To m_Datareader.FieldCount - 1
                If intcount <> m_Datareader.FieldCount - 1 Then
                    sw.Write(String.Format("""{0}"",", m_Datareader.Item(intcount)))
                Else
                    sw.Write(String.Format("""{0}""", m_Datareader.Item(intcount)))
                End If
            Next
            sw.WriteLine("")
        Loop
        m_Datareader.Close()
        m_DebugMessage = m_DebugMessage & "m_Datareader.Close(): "
        m_Datareader = Nothing
    Else
        m_DebugMessage = m_DebugMessage & "m_Datareader.Read = FALSE: "
    End If
    sw.Flush() 'COMMIT LAST SECTION TO WRITER
    If sw.BaseStream Is Nothing Then
        m_DebugMessage = m_DebugMessage & "  |  |NOTHING IN THE STREAM: "
    Else
        m_DebugMessage = m_DebugMessage & "  |  |THERE IS SOMETHING IN THE STREAM: "
    End If


    m_sr = New IO.StreamReader(sw.BaseStream)
    m_sr.BaseStream.Seek(0, System.IO.SeekOrigin.Begin)
    m_ReturnStream = m_sr.BaseStream

    If m_ReturnStream.CanRead Then
        retVal = True
        m_DebugMessage = m_DebugMessage & "  |  | 2ND TIME - THERE IS SOMETHING IN THE STREAM: "

    Else
        retVal = False
        m_DebugMessage = m_DebugMessage & "  |  |NOTHING IN THE RETURN STREAM: "
    End If



    Return retVal

End Function

Эта функция преобразует datareader в поток CSV. В другой функции я конвертирую этот поток в строку и записываю ее в файл:

File.WriteAllBytes(outboundFileFullPath, Encoding.ASCII.GetBytes(data))

Надеюсь, это поможет понять мою проблему.

Или другой способ: записать MemoryStream прямо в файл. Я пробовал это, но не работал. Спасибо!

ОБНОВЛЕНИЕ # 2 Вот что я сделал по предложению Ромиля:

   Dim dateValue As Date
                    If intcount <> m_Datareader.FieldCount - 1 Then
                        If (DateTime.TryParse(m_Datareader.Item(intcount).ToString(), dateValue)) Then
                            sw.Write(String.Format("""{0}"",", dateValue.ToString("yyyy-MM-dd")))
                        Else
                            sw.Write(String.Format("""{0}"",", m_Datareader.Item(intcount)))
                        End If
                    Else
                        sw.Write(String.Format("""{0}""", m_Datareader.Item(intcount)))
                    End If

person Learner    schedule 07.03.2013    source источник
comment
Делитесь своими исследованиями, это помогает всем. Расскажите нам, что вы пробовали и почему это не удовлетворило ваши потребности. Это демонстрирует, что вы нашли время, чтобы попытаться помочь себе, это избавляет нас от повторения очевидных ответов, и, прежде всего, это помогает вам получить более конкретный и актуальный ответ!   -  person juergen d    schedule 07.03.2013
comment
.NET не преобразует его в ММ/ДД/ГГГГ, хотя строковое представление может выглядеть так после вызова ToString. Теперь посмотрим, действительно ли это теперь строка и откуда. Ссылка Строки формата DateTime.   -  person    schedule 07.03.2013


Ответы (2)


Используйте 1_

string input = "2000-02-02";
    DateTime dateTime;
    if (DateTime.TryParse(input, out dateTime))
    {
        Console.WriteLine(dateTime);
    }

Дополнительный пример

person Romil Kumar Jain    schedule 07.03.2013

Вы можете переопределить культуру по умолчанию для текущего потока, чтобы указать формат DateTime по умолчанию, который вы хотите:

    Dim c As CultureInfo = New CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.Name)
    c.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd"
    c.DateTimeFormat.LongTimePattern = "HH:mm:ss.fff"
    System.Threading.Thread.CurrentThread.CurrentCulture = c
person Slava    schedule 07.03.2013