Я вставляю данные из набора типизированных данных в базу данных 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. Должно быть между 1/1/1753 12:00:00 AM и 12/31/9999 11:59:59 PM. Есть ли способ сказать в foreach что-то вроде этого: если значение поля DateTime из набора данных - DateTime.MinValue, не вставляйте поле DateTime из набора данных в мою базу данных?
С наилучшими пожеланиями
Я думаю, вам нужно убедиться, что нет DateTime.MinValue в datatable - контролируете ли вы население этой таблицы?
Если это так, вместо хранения DateTime.MinValue в поле DateTime вместо этого используйте SqlDateTime.MinValue . Или вместо этого сохраните DBNull в datatable, если вы хотите, чтобы NULL хранился в БД.
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;
}
}
}
}
}
}