Получите переполнение SqlDateTime в SqlBulkCopy.WriteToServer () - PullRequest
1 голос
/ 15 декабря 2009

Я вставляю данные из набора типизированных данных в базу данных MSSQL с помощью класса 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);
        }
    }
}

Отлично работает. Но когда я вставляю DataTime.MinValue в свою базу данных, я получаю эту ошибку: переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 31.129999 11:59:59 вечера. Есть ли способ сказать в foreach что-то вроде этого: если значение поля DateTime из набора данных равно DateTime.MinValue, не вставлять поле DateTime из набора данных в мою базу данных?

С наилучшими пожеланиями

Ответы [ 3 ]

1 голос
/ 15 декабря 2009

Я думаю, вам нужно убедиться, что в таблице данных нет DateTime.MinValue - вы контролируете заполнение этой таблицы?

Если это так, вместо сохранения DateTime.MinValue в поле DateTime используйте взамен SqlDateTime.MinValue . Или вместо этого сохраните DBNull в таблице данных, если хотите, чтобы NULL хранился в БД.

0 голосов
/ 14 июля 2015
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;
                    }
                }
            }
        }
    }
} 
0 голосов
/ 15 декабря 2009

Если у вас есть SQL Server 2008 и вы не против сохранить MinValue, вы можете обойти это, используя DateTime2 .

...