2010-08-09 28 views
2

我想要做的基本上是採取任何通用數據表,然後 轉換所有的日期時間列到SQLDATETIME列。 (即如果日期時間列值= datetime.MinValue然後將其設置爲SqlDateTime.Null)將所有的datetime列,以SQLDATETIME列在一個DataTable

是否有無論如何我可以做到這一點,而不改變原來的數據表(即無需計算列)或不得不解析整個數據錶行按行?

我想這樣做的原因是因爲我需要將此Datatable提供給SQLBulkCopy方法,該方法將它們全部寫入數據庫。使用datetime字段的問題是它在上傳時引發錯誤。

的AgentX

回答

0

嗯,我知道它是由行復制的數據錶行的最好我能想出是這樣的,

,我相信它可以更優雅與LINQ做,

任何人都有答案?

   Dim dtOut As DataTable = dt.Clone() 
       For Each c As DataColumn In dtOut.Columns 
        If c.DataType.FullName = GetType(DateTime).FullName Then 
         c.DataType = GetType(SqlTypes.SqlDateTime) 
        End If 
       Next 

       dtOut.BeginLoadData() 
       Dim drtmp As DataRow 
       For Each dr As DataRow In dt.Rows 
        drtmp = dtOut.NewRow() 
        For Each dc As DataColumn In dt.Columns 
         If dc.DataType.FullName = GetType(DateTime).FullName Then 
          If dr(dc) = Date.MinValue Then 
           drtmp(dc.ColumnName) = SqlTypes.SqlDateTime.Null 
          Else 
           drtmp(dc.ColumnName) = dr(dc) 
          End If 
         Else 
          drtmp(dc.ColumnName) = dr(dc) 
         End If 
        Next 
        dtOut.Rows.Add(drtmp) 
       Next 
       dtOut.EndLoadData() 
+0

是否缺少'dtOut.Rows.Add(drtmp)'? – IAbstract 2010-12-14 20:49:06

+0

另外,您可能想要除去變量'i'&'j'的定義。 – IAbstract 2010-12-14 20:56:49

+0

謝謝,修正了它。 – JustShrey 2011-01-30 07:30:21

0
public void ChangeDateTimeColumn(DataTable newDataTable) 
{ 
    for (int i = 0; i < newDataTable.Rows.Count; i++) 
    { 
     for (int j = 0; j < newDataTable.Columns.Count; j++) 
     { 
      DataColumn dc = newDataTable.Columns[j]; 
      if (dc.DataType == typeof(DateTime)) 
      { 
       string name = dc.ColumnName; 
       DataRow row = newDataTable.Rows[i]; 
       if (row[name] != null && row[name].ToString().Trim() != "") 
       { 
        DateTime value = (DateTime)row[name]; 
        if (value < (DateTime)SqlDateTime.MinValue) 
        { 
         row[name] = (DateTime)SqlDateTime.MinValue; 
        } 
        else if ((DateTime)SqlDateTime.MaxValue < value) 
        { 
         row[name] = (DateTime)SqlDateTime.MaxValue; 
        } 
       } 
      } 
     } 
    } 
} 
相關問題