Obtener SqlDateTime desbordamiento en SqlBulkCopy.WriteToServer ()

asp.net sql sqlbulkcopy

Pregunta

Inserto datos de un conjunto de datos mecanografiado en mi base de datos MSSQL utilizando la clase SqlBuldCopy:

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

Funciona muy bien Pero cuando inserto DataTime.MinValue en mi base de datos, obtengo este error: SqlDateTime overflow. Debe estar entre el 1/1/1753 12:00:00 AM y el 12/31/9999 11:59:59 PM. ¿Hay alguna manera de decir en el foreach algo como esto: si el valor del campo DateTime del conjunto de datos es DateTime.MinValue, no inserte el campo DateTime del conjunto de datos en mi base de datos?

Atentamente

Respuesta aceptada

Creo que deberías asegurarte de que no haya DateTime.MinValue en la tabla de datos: ¿controlas la población de esa tabla?

Si es así, en lugar de almacenar DateTime.MinValue en un campo de DateTime, use SqlDateTime.MinValue en su lugar. O, almacene DBNull en el datatable en lugar de si desea que NULL se almacene en el DB.


Respuesta popular

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué