在SqlBulkCopy.WriteToServer()中獲取SqlDateTime溢出

asp.net sql sqlbulkcopy

我使用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溢出。必須在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之間。有沒有辦法在foreach中說這樣的事情:如果數據集中的DateTime字段值是DateTime.MinValue,請不要將數據集中的DateTime字段插入到我的數據庫中?

最好的祝福

一般承認的答案

我認為您需要確保數據表中沒有DateTime.MinValue - 您是否控制該表的填充?

如果是這樣,而不是在DateTime字段中存儲DateTime.MinValue,而是使用SqlDateTime.MinValue 。或者,如果要將NULL存儲到數據庫中,請將DBNull存儲在數據表中。


熱門答案

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;
                    }
                }
            }
        }
    }
} 


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因