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。当您切换到数据表时,它消失了,因为它们没有额外的行。不过,您仍然不需要所有这些旋转。
我正在尝试使用 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。当您切换到数据表时,它消失了,因为它们没有额外的行。不过,您仍然不需要所有这些旋转。