【问题标题】:Get SqlDateTime overflow in SqlBulkCopy.WriteToServer()在 SqlBulkCopy.WriteToServer() 中获取 SqlDateTime 溢出
【发布时间】:2009-12-15 09:19:00
【问题描述】:

我使用 SqlBuldCopy 类将类型化数据集中的数据插入到我的 MSSQL 数据库中:

foreach (DataTable dt in ds.Tables)
{
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) 
    {
        bulkCopy.DestinationTableName = "dbo." + dt.TableName + "_neu";

        try
        {
            bulkCopy.WriteToServer(dt);
        }
        catch (Exception ex)
        {
            throw new FaultException("\n" + dt.TableName + ": " + ex.Message);
        }
    }
}

效果很好。但是当我将 DataTime.MinValue 插入我的数据库时,我得到了这个错误:SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间。 有没有办法在 foreach 中这样说:如果数据集中的 DateTime 字段值为 DateTime.MinValue,则不要将数据集中的 DateTime 字段插入我的数据库中?

最好的问候

【问题讨论】:

    标签: asp.net sql sqlbulkcopy


    【解决方案1】:

    我认为您需要确保数据表中没有 DateTime.MinValue - 您是否控制该表的数量?

    如果是这样,不要将 DateTime.MinValue 存储在 DateTime 字段中,而是使用 SqlDateTime.MinValue。或者,如果您希望将 NULL 存储到 DB 中,请将 DBNull 存储在数据表中。

    【讨论】:

    • 感谢您的回答。我不控制数据表的人口。我从 Web 服务获取数据库。如何在 bulkCopy.WriteToServer(dt); 之前检查如果 DateTime 字段不是 DateTime.MinValue?如果为 true,则将 DBNull 存储在数据库中。
    • 您可以遍历每一行,并更改所有具有 DateTime.MinValue 的 DateTime 字段
    【解决方案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;
                        }
                    }
                }
            }
        }
    } 
    

    【讨论】:

    • 请在您已修改的地方添加一些文本以解决问题。
    【解决方案3】:

    如果您有 SQL Server 2008 并且不介意存储 MinValue,您可以使用 DateTime2 来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多