将数据表中的所有 DateTime 列转换为 SqlDateTime 列
Posted
技术标签:
【中文标题】将数据表中的所有 DateTime 列转换为 SqlDateTime 列【英文标题】:Converting all the DateTime Columns to SqlDateTime Columns in a Datatable 【发布时间】:2011-03-27 05:26:44 【问题描述】:我想要做的基本上是采取 any generic DataTable 然后 将所有 DateTime 列转换为 SqlDateTime 列。 (即如果日期时间列值 = datetime.MinValue 则将其设置为 SqlDateTime.Null)
我是否可以在不更改原始数据表(即不添加计算列)或不必逐行解析整个数据表的情况下做到这一点?
我想这样做的原因是因为我需要将此 Datatable 提供给 SQLBulkCopy 方法,该方法会将它们一起写入数据库。使用 datetime 字段的问题是它在上传时会抛出错误。
AgentX
【问题讨论】:
【参考方案1】:嗯,我能想到的最好的就是这个,
我知道它是逐行复制数据表,我相信使用 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()
【讨论】:
你错过了dtOut.Rows.Add(drtmp)
吗?
另外,您可能希望删除变量 i
和 j
的定义。【参考方案2】:
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;
【讨论】:
以上是关于将数据表中的所有 DateTime 列转换为 SqlDateTime 列的主要内容,如果未能解决你的问题,请参考以下文章
将 pandas 列转换为 datetime64,包括缺失值
将包含多种字符串日期格式的列转换为 Spark 中的 DateTime
如何使用 linq 将 DATETIME 类型的列转换为字符串
即使没有 datetime 列,也获取“将 varchar 数据类型转换为 datetime 数据类型导致超出范围的值”
如何识别列抛出 System.Data.SqlClient.SqlException? (将 datetime2 数据类型转换为 datetime 数据类型)