在 DataRow 中设置项目的值不起作用

发布于 2024-07-07 03:40:47 字数 956 浏览 6 评论 0原文

我正在尝试将 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 作斗争,不幸的是我无法选择使用哪个组件。

I am trying to convert all DateTime values in a DataTable to strings. Here is the method I use:

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");
        }
    }
}

After this line works:

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

I check the value of dataTable.Rows[rowIndex][i] and see it is still a DateTime, not a string. Why does this happen and how can I solve this?

Edit: I am trying to do this because I am fighting an api and unfortunately I do not have the choice of which component to use.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

撞了怀 2024-07-14 03:40:47

这根本行不通,因为您还没有更改底层数据类型。

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

您可以为其分配一个字符串,但它会转换回日期时间。

为什么要改成格式化字符串呢? 难道不能仅在需要显示时才格式化,并在必须显示之前将其处理为 DateTime 吗?

更新:如果您在尝试转换之前检查列的类型,效果会更快:

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

This simply won't work, because you haven't changed the underlaying data type.

You have a DataTable, with a column which has data type DateTime.

You can assign a String to it, but it will convert back to DateTime.

Why do you want to change it to a formatted string? Can't you format only when you need to display it, and handle as a DateTime until you have to display it?

Update: it is also better if you check the column's type before you try to convert, it can be much faster:

if (dataTable.Columns[0].DataType == typeof(DateTime))
{
}
荭秂 2024-07-14 03:40:47

它可能已确定列数据类型为日期时间,并且当您将值保存回其中时,将值重新装箱为日期时间。

尝试这个...
在数据表上创建一个新列作为 TypeOf(String),并将字符串值保存到该列中。 复制所有值后,删除日期时间列。

It may have determined that the column data type is date time and is reboxing the values to datetime when you save the value back in there.

Try this...
Create a new column on the datatable as a TypeOf(String), and save the string value into that column. When all the values have been copied, drop the date time column.

謌踐踏愛綪 2024-07-14 03:40:47

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

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:我没有测试代码,这取决于你。

It won't work beacuse the DataType of the column is still DateTime and it'll convert the string back to datetime.
I'd suggest to format the date to string when generating your API message. If you still need to generate a string column for datetime values

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");
     }
   }
}

Then you can remove all DateTime columns or use a dataTable.Select() to get only the columns you need.
PS: I didn't test the code, it's up to you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文