Изменение DateTimeMode для нескольких столбцов в таблице данных после того, как она была заполнена данными - PullRequest
0 голосов
/ 14 мая 2009

Мне нужно изменить DateTimeMode некоторых столбцов в уже заполненном наборе данных. (Я не хочу менять его до того, как он будет заполнен, поскольку это будет означать внесение изменений в несколько методов через приложение.)

Вот stmt, который я использую (для одного столбца):

copy.Tables[0].Columns["DateColName"].DateTimeMode = DataSetDateTime.Utc;

Однако выдается ошибка, из-за которой невозможно изменить DateTimeMode, если набор данных содержит данные. Таким образом, решение, которое я думаю, заключается в создании клона набора данных, изменении DateTimeMode требуемых столбцов и последующей загрузке данных обратно.

DataSet copy = dsdata.Clone();
copy.Tables[0].Columns["DateColName"].DateTimeMode = DataSetDateTime.Utc;
copy.Load(dsdata.CreateDataReader(), LoadOption.OverwriteChanges, "TableName");

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 26 февраля 2010

попробуйте, ура

    private void SetUtcDateTime()
    {
        var ds = new DataSet { Locale = CultureInfo.InvariantCulture };

        foreach (DataTable source in DataSet.Tables)
        {
            bool containsDate = false;
            var target = source.Clone();

            foreach (DataColumn col in target.Columns)
            {
                if (col.DataType == System.Type.GetType("System.DateTime"))
                {
                    col.DateTimeMode = DataSetDateTime.Utc;
                    containsDate = true;
                }
            }

            if (containsDate)
            {
                foreach (DataRow row in source.Rows)
                    target.ImportRow(row);
                ds.Tables.Add(target);
            }
            else
            {
                ds.Tables.Add(source.Copy());
            }
        }
        DataSet.Tables.Clear();
        DataSet = ds;
    }

где 'DataSet' - это публичное свойство вашего объекта.

0 голосов
/ 06 ноября 2009

Я тоже столкнулся с этой проблемой. DateTimeMode не может быть изменен после заполнения набора данных, поэтому единственное решение, которое я могу найти, - это заново создать столбец с правильным DateTimeMode.

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

 private static void SetDateTimeMode(DataTable table, DataColumn col, DataSetDateTime mode)
        {
            var rowValues = new object[table.Rows.Count];

            for (int i = 0; i < rowValues.Length; i++)
            {
                // ignore deleted rows
                if (table.Rows[i].RowState == DataRowState.Deleted) continue;

                rowValues[i] = table.Rows[i][col];
            }

            // we must remove and re-add the row because DateTimeMode cannot be
            // changed on a column that has data.
            table.Columns.Remove(col);

            col.DateTimeMode = mode;

            table.Columns.Add(col);

            // write back each row value
            for (int i = 0; i < rowValues.Length; i++)
            {
                // ignore deleted rows
                if (table.Rows[i].RowState == DataRowState.Deleted) continue;

                var rowState = table.Rows[i].RowState;

                table.Rows[i][col] = rowValues[i];

                // preserve unchanged rowstate
                if (rowState == DataRowState.Unchanged)
                    table.Rows[i].AcceptChanges();
            }
        }

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

...