2009-12-15 45 views
1

我插入从类型化数据集的数据到我的MSSQL数据库使用SqlBuldCopy类:获取SqlBulkCopy.WriteToServer SQLDATETIME溢()

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字段插入到我的数据库中?

问候

回答

1

我想你需要确保没有DateTime.MinValue的DataTable中 - 你控制该表的人口?

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

+0

谢谢你的回答。我不控制数据表的人口。我从Web服务获取数据库。我怎么才能检查bulkCopy.WriteToServer(dt);如果DateTime字段不是DateTime.MinValue?如果在数据库中真正存储DBNull。 – 2009-12-15 09:28:27

+0

您可以遍历每一行,并更改所有具有DateTime.MinValue的日期时间字段 – AdaTheDev 2009-12-15 09:38:45

0

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

0
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

请在添加一些文本以修改问题。 – Garry 2015-07-14 05:29:18

相关问题