【问题标题】:Converting all the DateTime Columns to SqlDateTime Columns in a Datatable将数据表中的所有 DateTime 列转换为 SqlDateTime 列
【发布时间】:2011-03-27 05:26:44
【问题描述】:

我想要做的基本上是采取 any generic DataTable 然后 将所有 DateTime 列转换为 SqlDateTime 列。 (即如果日期时间列值 = datetime.MinValue 则将其设置为 SqlDateTime.Null)

我是否可以在不更改原始数据表(即不添加计算列)或不必逐行解析整个数据表的情况下做到这一点?

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

AgentX

【问题讨论】:

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


    【解决方案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) 吗?
    • 另外,您可能希望删除变量 ij 的定义。
    【解决方案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;
                        }
                    }
                }
            }
        }
    } 
    

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多