如何检查 SQLDataReader 项是不是为 DateTime os String 类型值?

Posted

技术标签:

【中文标题】如何检查 SQLDataReader 项是不是为 DateTime os String 类型值?【英文标题】:How to check if SQLDataReader item is DateTime os String type value?如何检查 SQLDataReader 项是否为 DateTime os String 类型值? 【发布时间】:2013-03-07 19:13:35 【问题描述】:

我有一个将 datareader 转换为 CSV 的函数。 SQL 返回 YYYY-MM-DD HH:MM:SS.000 而 .net 将其转换为 MM/DD/YYYY 值。 我想检查数据读取器中的值是否为 DateTime 并将其转换回 YYYY-MM-DD HH:MM:SS.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("0WriteLine(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

此函数将数据读取器转换为 CSV 流。在另一个函数中,我将此流转换为字符串并将其写入文件:

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

希望这有助于理解我的问题。

或者另一种方式是:将 MemoryStream 直接写入文件。我试过了,但没有用。 谢谢!

更新#2 这是我根据Romil的建议所做的:

   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

【问题讨论】:

分享您的研究对每个人都有帮助。告诉我们您尝试了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案! .NET 不会将其“转换”为“MM/DD/YYYY”,尽管在调用 ToString字符串表示 可能看起来像这样。现在看看它现在是否确实是一个字符串,以及从哪里来。参考。 DateTime Format Strings. 【参考方案1】:

使用DateTime.TryParse

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

More Example

【讨论】:

【参考方案2】:

您可以覆盖当前线程的默认区域性以指定所需的默认日期时间格式:

    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

【讨论】:

以上是关于如何检查 SQLDataReader 项是不是为 DateTime os String 类型值?的主要内容,如果未能解决你的问题,请参考以下文章

检查它是不是是 sqldatareader 中的最后一条记录

SqlDataReader 检查空值的最佳方法 -sqlDataReader.IsDBNull vs DBNull.Value

如何判断SqlConnection是否附加了SqlDataReader?

检查datagridview单元格中的数据是不是为null

SqlDataReader - 如何将当前行转换为字典

检查SqlDataReader列是否存在(扩展方法)