将所有DateTime列转换为Datatable中的SqlDateTime列

时间:2010-08-09 10:19:42

标签: .net sql-server-2005 datatable type-conversion

我想要做的基本上是 任何通用的 DataTable然后 将所有DateTime列转换为SqlDateTime列。 (即如果datetime列值= datetime.MinValue则将其设置为SqlDateTime.Null)

无论如何我可以在不改变原始数据表的情况下(即不添加计算列)或者必须逐行解析整个数据表吗?

我想这样做的原因是因为我需要将这个Datatable提供给SQLBulkCopy方法,该方法将它们全部写入数据库。使用datetime字段的问题是它在上传时会抛出错误。

的AgentX

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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;
                    }
                }
            }
        }
    }
}