Установка значения элемента в потоке данных не работает

StackOverflow https://stackoverflow.com/questions/204406

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь преобразовать все значения DateTime в DataTable в строки.Вот метод, который я использую:

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, и, к сожалению, у меня нет выбора, какой компонент использовать.

Это было полезно?

Решение

Возможно, он определил, что типом данных столбца является дата-время, и перепаковывает значения в datetime, когда вы сохраняете значение обратно туда.

Попробуй это...Создайте новый столбец в datatable как TypeOf(String) и сохраните строковое значение в этом столбце.Когда все значения будут скопированы, удалите столбец даты и времени.

Другие советы

Это просто не сработает, потому что вы не изменили базовый тип данных.

У вас есть DataTable со столбцом, который имеет тип данных DateTime.

Вы можете присвоить ему строку, но она будет преобразована обратно в DateTime.

Почему вы хотите изменить его на форматированную строку?Разве вы не можете форматировать только тогда, когда вам нужно это отобразить, и обрабатывать как DateTime до тех пор, пока вам не придется это отображать?

Обновить: также будет лучше, если вы проверите тип столбца перед попыткой преобразования, это может быть намного быстрее:

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

Это не сработает, потому что типом данных столбца по-прежнему является DateTime, и он преобразует строку обратно в datetime.Я бы предложил отформатировать дату в строку при создании вашего сообщения API.Если вам все еще нужно сгенерировать столбец string для значений 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.Выберите(), чтобы получить только нужные вам столбцы.PS:Я не тестировал код, это зависит от вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top