Установка значения элемента в потоке данных не работает
Вопрос
Я пытаюсь преобразовать все значения 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:Я не тестировал код, это зависит от вас.