在 DataRow 中设置项的值无效

5

我想把DataTable中所有的DateTime值转换成字符串。这是我使用的方法:

private static void ConvertDateTimesToStrings(DataTable dataTable)
{
    if (dataTable == null)
    {
        return;
    }

    for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++ )
    {
        for (int i = 0; i < dataTable.Columns.Count; i++)
        {
            DateTime dateTime;
            try
            {
                dateTime = (DateTime)dataTable.Rows[rowIndex][i];
            }
            catch (InvalidCastException)
            {
                continue;
            }
            dataTable.Rows[rowIndex][i] = dateTime.ToString("dd.MM.yyyy hh:mm:ss");
        }
    }
}

在这行代码运行之后:

dataTable.Rows[rowIndex][i] = dateTime.ToString("dd.MM.yyyy hh:mm:ss");

我检查了dataTable.Rows[rowIndex][i]的值,发现它仍然是一个DateTime类型,而不是一个字符串。为什么会这样,我该如何解决?

编辑:我正在尝试这样做是因为我在与API进行交互,不幸的是我没有选择使用哪个组件。


精心设计的API使正确使用变得容易,而错误使用则变得困难或不可能。像C#这样更现代的语言中大多数内置的API都是经过精心设计的。一般来说,如果您发现自己在与API进行这种斗争,那么是时候重新考虑您正在尝试做什么了。 - Greg D
3个回答

14

由于您没有更改基础数据类型,所以这根本行不通。

您有一个DataTable,其中一个列的数据类型为DateTime。

您可以将字符串赋值给它,但它会转换回DateTime。

为什么要将其更改为格式化的字符串?在需要显示它之前,您不能仅在需要时进行格式化,并将其处理为DateTime吗?

更新:在尝试转换之前检查列的类型也更好,因为它可能会快得多。

if (dataTable.Columns[0].DataType == typeof(DateTime))
{
}

6

可能是数据列的类型被确定为日期时间,当你将值保存回去时,它正在将值重新封装为日期时间。

试试这个... 在数据表上创建一个新列,类型为字符串,把字符串值保存到该列中。当所有值都被复制后,删除日期时间列。


我使用了你的解决方案和Biri提供的信息,问题已经解决。非常感谢你们两个。 - Serhat Ozgel

1

它不会起作用,因为该列的 DataType 仍然是 DateTime,并且它会将字符串转换回 DateTime。我建议在生成 API 消息时将日期格式化为字符串。如果您仍然需要为 datetime 值生成字符串列

foreach (DataColumn column in dataTable.Columns) {
  if (column.DataType == typeof(DateTime)) {
    dataTable.Columns.Add(column.ColumnName + "_string", typeof(string));
  }
}

foreach (DataRow row in dataTable.Rows) {
   foreach (DataColumn column in dataTable.Columns) {
     if (column.DataType == typeof(DateTime)) {
       row[column.ColumnName + "_string"] = row[column.ColumnName].ToString("dd.MM.yyyy hh:mm:ss");
     }
   }
}

然后您可以删除所有的DateTime列或使用dataTable.Select()仅获取您需要的列。 PS:我没有测试过这段代码,由您自行决定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接