Установка значения элемента в DataRow не работает - PullRequest
4 голосов
/ 15 октября 2008

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

Ответы [ 3 ]

14 голосов
/ 15 октября 2008

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

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

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

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

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

if (dataTable.Columns[0].DataType == typeof(DateTime))
{
}
6 голосов
/ 15 октября 2008

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

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

1 голос
/ 15 октября 2008

Это не сработает, потому что DataType столбца по-прежнему DateTime, и он преобразует строку обратно в 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: я не проверял код, это зависит от вас.

...