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

标签 mysql .net vb.net datagridview date-parsing

我正在尝试使用 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

在构造duration变量的过程中解析日期时,会抛出错误:

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

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

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

有什么帮助吗?

最佳答案

有一种更简单的方法来获取持续时间,而且是一种非常非常简单的方法。

部分问题是这样的:我正在尝试使用 VB.NET 将 MySQL 时间转换为字符串。不需要转换为字符串。如果该列实际上是 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。当您切换到数据表时,它消失了,因为它们没有额外的行。不过,您仍然不需要所有这些旋转。

关于MySQL 字符串未转换为 .NET 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36583483/

相关文章:

mysql - 如何优化我的 MySQL 服务器?

c# - Entity Framework 代码优先、聚簇索引和复合键

vb.net - 适用于 .NET 的免费时间表/时间表 GUI 库

.net - C# 值类型装箱。关于装箱包装器和值类型的大小和类型的问题

vb.net - 在 Winforms 中是否有等同于 trace=true 的东西?

vb.net - 在 Visual Basic 中使用冒号将两个语句放在同一行

python - SQLAlchemy 的外键约束错误

java - mysql 中的位问题

mysql - 使用node.js执行查询后返回MySQL结果

.net - 跨换行符匹配正则表达式?