2009-05-14 1 views
0

すでにデータが格納されているデータセットの一部の列のDateTimeModeを変更する必要があります。 (。それはアプリケーションthroughtoutいくつかの方法で変更を加えることを意味するであろうと、それが読み込まれる前に、私はそれを変更する必要はありません)データテーブルにデータが挿入された後に、いくつかの列の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"); 

これを行うには良い方法がありますか?

答えて

0

私もこの問題に直面しました。データセットが一度満たされたら、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を維持するために戻って、列に行の値をコピーするときあなたはただ、注意する必要があります。

1

は、 'データセット' は、オブジェクトのパブリックプロパティです歓声

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

をこれを試してみてください。

関連する問題