MySQL 字符串未转换为 .NET 时间

MySQL String Not Converting to .NET Time

我正在尝试使用 VB.NET 将 MySQL 时间转换为字符串。

    Dim adpt As New MySqlDataAdapter(dbcmdstring, connection)
    Dim myDataTable As New DataTable()
    adpt.Fill(myDataTable)

    DataGridView1.DataSource = myDataTable
    DataGridView1.Columns.Remove("ActivityID")
    DataGridView1.Columns.Remove("ActivityDate")
    DataGridView1.Columns.Remove("UserID")
    DataGridView1.Columns(0).HeaderCell.Value = "Name"
    DataGridView1.Columns(1).HeaderCell.Value = "Start Time"
    DataGridView1.Columns(2).HeaderCell.Value = "End Time"
    DataGridView1.Columns.Add("Duration", "Duration")
    DataGridView1.RowHeadersVisible = False

    Dim duration As New TimeSpan
    Dim durationStr As String = ""
    Dim i As Integer = 0
    For Each row As DataGridViewRow In DataGridView1.Rows
        duration = Date.Parse(row.Cells(2).Value.ToString).Subtract(Date.Parse(row.Cells(1).Value.ToString))
        durationStr = Math.Round(duration.TotalMinutes).ToString & ":" & Math.Round(duration.TotalSeconds).ToString
        row.Cells(3).Value = durationStr
    Next

在构造持续时间变量期间解析日期时,会抛出错误:

An unhandled exception of type 'System.NullReferenceException' occurred in WindowsApplicationSQL.exe

Additional information: Object reference not set to an instance of an object.

我可以成功解析日期并将其显示在消息框中,但无法将其转换为可用的字符串。我也尝试过只使用时间的 .value。

有什么帮助吗?

我尝试通过 DataTable 而不是 DataGridView 来完成它,并且成功了!

    myDataTable.Columns.Add("Duration", GetType(String))
    myDataTable.Columns.Remove("ActivityID")
    myDataTable.Columns.Remove("ActivityDate")
    myDataTable.Columns.Remove("UserID")

    DataGridView1.DataSource = myDataTable
    DataGridView1.RowHeadersVisible = False
    DataGridView1.Columns(0).HeaderCell.Value = "Name"
    DataGridView1.Columns(1).HeaderCell.Value = "Start Time"
    DataGridView1.Columns(2).HeaderCell.Value = "End Time"

    Dim duration As New TimeSpan
    Dim durationStr As String = ""
    Dim i As Integer = 0
    For Each row As DataRow In myDataTable.Rows
        duration = Date.Parse(row.Item("EndTime").ToString).Subtract(Date.Parse(row.Item("StartTime").ToString))
        durationStr = Math.Round(duration.Minutes).ToString & ":" & Math.Round(duration.Seconds).ToString
        row.Item("Duration") = durationStr
    Next

有一种更简单的方法来获取持续时间,还有一种更简单的方法。

部分问题是这样的:I am trying to convert a MySQL time to a string using VB.NET.不需要转换成字符串。如果该列实际上是 MySQL 中的 Time() 列,则它有一个 NET 对应项:TimeSpan 并且它可以很容易地用于通过减法计算差值。

更简单的方法

dtLog.Columns.Add(New DataColumn("Duration", GetType(TimeSpan)))
For Each r As DataRow In dtLog.Rows
    r("Duration") = r.Field(Of TimeSpan)("EndTime") - r.Field(Of TimeSpan)("StartTime")
Next

如果您使用数据源,通过 DataGridView 操作数据很少是个好主意。注意:不需要字符串。

非常非常简单的方法

执行SQL中的操作:

Dim sql = "SELECT ... StartTime, EndTime, TIMEDIFF(EndTime, StartTime) As Duration FROM ActivityLog"

这将在包含结果的 DataTable 中创建一个 Duration 列。同样,如果您不想要某些列,您可以从 SQL 中省略它们而不是删除 DGV 列。

对象引用未设置为对象的实例。

最后,这个错误可能与MySQL到VB、字符串或TimeSpans的转换无关。默认情况下,DGV 在底部有额外的行 - 用户开始添加数据的 NewRow - 但所有单元格都没有。所以:

For Each row As DataGridViewRow In DataGridView1.Rows

这将尝试处理 NewRow 并且在它的单元格周围查找将导致 NRE。当您切换到数据表时,它消失了,因为它们没有额外的行。不过,您仍然不需要所有这些旋转。