VB.net datacolumn.expression-将秒转换为hh:mm:ss

VB.net datacolumn.expression-将秒转换为hh:mm:ss,vb.net,Vb.net,我有一个数据表,其中列“Duration(s)”是以秒为单位的时间。我添加了一个表达式列,并希望使用它来显示持续时间(s)列,但格式为hh:mm:ss。msdn文档表明这是可能的,因为TimeSpan是一个受支持的函数 以下表达式被接受,但在尝试计算时生成错误 (错误是:System.Data.dll中发生类型为“System.Data.EvaluateException”的未处理异常-其他信息:类型名称“TimeSpan.FromSeconds([Duration(s)])”无效) 有没有人有

我有一个数据表,其中列“Duration(s)”是以秒为单位的时间。我添加了一个表达式列,并希望使用它来显示持续时间(s)列,但格式为hh:mm:ss。msdn文档表明这是可能的,因为TimeSpan是一个受支持的函数

以下表达式被接受,但在尝试计算时生成错误

(错误是:System.Data.dll中发生类型为“System.Data.EvaluateException”的未处理异常-其他信息:类型名称“TimeSpan.FromSeconds([Duration(s)])”无效)

有没有人有一个在DataColumn表达式中正确使用TimeSpan的工作示例,因为我没有在网上找到任何实例(目前我正在创建一个新列,并循环遍历每一行,以这种方式创建hh:mm:ss列,但这种方式有点混乱)。我认为我的错误是timespan的不正确使用和Duration(s)是int32的事实的结合,msdn文档建议timespan在这种情况下只能从一个字符串到另一个字符串工作

我使用的是VS2013,目标框架是4.0。

试试这个:

TimeSpan.FromSeconds([Duration(s)]).Hours.ToString.PadLeft(2, "0"c) & ":" & _
                    TimeSpan.FromSeconds([Duration(s)]).Minutes.ToString.PadLeft(2, "0"c) & ":" & _
                    TimeSpan.FromSeconds([Duration(s)]).Seconds.ToString.PadLeft(2, "0"c)
请尝试以下方法:

TimeSpan.FromSeconds([Duration(s)]).Hours.ToString.PadLeft(2, "0"c) & ":" & _
                    TimeSpan.FromSeconds([Duration(s)]).Minutes.ToString.PadLeft(2, "0"c) & ":" & _
                    TimeSpan.FromSeconds([Duration(s)]).Seconds.ToString.PadLeft(2, "0"c)

CONVERT函数需要一个类型作为第二个参数。你不能在那里使用methid。此外,要使用TimeSpan类型的DataColumn的Expression属性的CONVERT函数,您需要创建TimeSpan类型的Expression列。
此时,您可以使用CONVERT函数。唯一需要记住的是,转换期望要转换的值的每个单位都表示为100纳秒

所以你可以试试这个方法

Dim nsec100 as Long = 10000000
Dim ts = new TimeSpan(nsec100)
Console.WriteLine("Total Seconds from 10000000 100ns = " & ts.TotalSeconds)

Dim dt = new DataTable()
dt.Columns.Add("SEC", Type.GetType("System.Int64"))
dt.Columns.Add("TS", Type.GetType("System.TimeSpan"), 
                     "CONVERT(SEC, System.TimeSpan)")
dt.Rows.Add(nsec100)
Console.WriteLine("TimeSpan:" & dt.Rows(0)(1).ToString())
这将产生以下输出

Total Seconds from 10000000 100ns 1
TimeSpan:00:00:01
此时,您可以将表达式更改为将秒值乘以10000000

dt.Columns.Add("TS", Type.GetType("System.TimeSpan"), 
                     "CONVERT(SEC * 10000000, System.TimeSpan)")

CONVERT函数需要一个类型作为第二个参数。你不能在那里使用methid。此外,要使用TimeSpan类型的DataColumn的Expression属性的CONVERT函数,您需要创建TimeSpan类型的Expression列。
此时,您可以使用CONVERT函数。唯一需要记住的是,转换期望要转换的值的每个单位都表示为100纳秒

所以你可以试试这个方法

Dim nsec100 as Long = 10000000
Dim ts = new TimeSpan(nsec100)
Console.WriteLine("Total Seconds from 10000000 100ns = " & ts.TotalSeconds)

Dim dt = new DataTable()
dt.Columns.Add("SEC", Type.GetType("System.Int64"))
dt.Columns.Add("TS", Type.GetType("System.TimeSpan"), 
                     "CONVERT(SEC, System.TimeSpan)")
dt.Rows.Add(nsec100)
Console.WriteLine("TimeSpan:" & dt.Rows(0)(1).ToString())
这将产生以下输出

Total Seconds from 10000000 100ns 1
TimeSpan:00:00:01
此时,您可以将表达式更改为将秒值乘以10000000

dt.Columns.Add("TS", Type.GetType("System.TimeSpan"), 
                     "CONVERT(SEC * 10000000, System.TimeSpan)")

你可以发布更多的代码,而不仅仅是一行的一部分吗?嗨,这就是所有的代码。我通过DataSet Designer在datatable中创建了新的datacolumn,并在properties中的表达式框中写入了上面的行。作为一个更大的背景,datatable在运行时是空的,并且在输入数据时填充,因此在添加数据之前不会出现错误。而且,在列名之前不需要datatable名称吗?DataTable1.([Duration(s)]?仅当您以编程方式添加时。在表达式框中,您只需输入“Duration(s)*10”例如,您可以发布更多的代码,而不仅仅是一行的一部分吗?嗨,这就是全部代码。我通过DataSet Designer在datatable中创建了新的datacolumn,并在properties中的Expression框中写入了上面的行。作为一个背景,datatable在运行时是空的,并且在输入数据时填充,因此在输入数据之前没有错误也不需要在列名前面加一个datatable名称吗?DataTable1。([Duration(s)]?只有在以编程方式添加时才需要。例如,在表达式框中,您可以只输入“Duration(s)*10”。唉,它不起作用。它说“表达式包含未定义的函数调用TimeSpan.FromSeconds()。”我认为它似乎期望TimeSpan可能与CONVERT一起使用,但问题是如何使用。唉,它不起作用。它说“表达式包含未定义的函数调用TimeSpan.FromSeconds()它似乎期望TimeSpan可能与CONVERT一起使用,我想,但问题是如何使用。太好了,谢谢Steve,这工作非常完美。非常感谢。太好了,谢谢Steve,这工作非常完美。非常感谢。