我想要做的基本上是 任何通用的 DataTable然后 将所有DateTime列转换为SqlDateTime列。 (即如果datetime列值= datetime.MinValue则将其设置为SqlDateTime.Null)
无论如何我可以在不改变原始数据表的情况下(即不添加计算列)或者必须逐行解析整个数据表吗?
我想这样做的原因是因为我需要将这个Datatable提供给SQLBulkCopy方法,该方法将它们全部写入数据库。使用datetime字段的问题是它在上传时会抛出错误。
的AgentX
答案 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;
}
}
}
}
}
}