2011-02-24 54 views
4

我有一个我正在尝试上传的DataTable,但我遇到了以下异常:
“数据源中String类型的给定值无法转换为指定目标的int类型柱。”SQLBulkCopy抛出InvalidOperationException可空的Ints

我认为它可能会这样做的唯一原因是DataTable中有空单元被上传到INT类型的列中。我尝试切换DBNull.Value的所有空值,但似乎不适用于此特定列。上传过程如下:

private void UploadTable(string tableName, DataTable table) 
    { 
     foreach (DataRow r in table.Rows) 
     { 
      foreach (DataColumn c in table.Columns) 
       if (r[c].ToString().Trim() == "") 
        r[c] = DBNull.Value; 
     } 

     using (SqlBulkCopy copy = new SqlBulkCopy(sqlCon)) 
     { 

      copy.DestinationTableName = tableName; 
      try 
      { 
       copy.WriteToServer(table); 
      } 
      catch (Exception ex) 
      { 
       lblError.Content = ex.ToString(); 
      } 
     } 
    } 

,我上传的架构是:

[dbo].[table](
[Date] [smalldatetime] NOT NULL, 
[Dollar] [varchar](50) NULL, 
[CName] [varchar](100) NULL, 
[tick] [varchar](10) NULL, 
[id1] [varchar](10) NOT NULL, 
[Total Quantity] [int] NULL, 
[Quantity] [int] NULL 
) 

是否有关于SqlBulkCopy的,而且我不知道可空INT coolumns一些特别的东西?任何输入赞赏。

+0

它在哪里抛出错误?在'copy.WriteToServer(table); 'line? – 2011-02-24 19:34:25

+0

@Abe Miessler - 更可能 - 是的 - 这可能是因为默认类型是字符串,他需要指定int。 – JonH 2011-02-24 19:35:48

+0

是的,就是这条线。 – SeanVDH 2011-02-24 19:35:57

回答

0

错误的文件输入导致错误 - 在它有小数,并不应该

2

将数据列添加到数据表时,是否指定列类型为int

+0

我没有,我会尝试手动做到这一点。但是,我会遇到另一个问题,因为我现在使用的方法会动态地添加列:http://exceldatareader.codeplex.com/,我不确定如何获取该列的数据类型。 – SeanVDH 2011-02-24 19:41:13

+0

@SeanVDH - 我从来没有使用过这个库,但必须有一个属性来显示列的类型。在excel中,你可以通过右击它来获得一列的格式。因此,必须有某种等价的东西。无论如何,你的错误是由于列是一个字符串,而不是你想要的数字,即一个int。 – JonH 2011-02-24 19:45:53

+0

如果你所说的话是真的,我并不积极,因为我以前从来没有遇到过这个错误,而且我确信我已经尝试过了 - 我认为DBNull.Value应该可以工作。无论如何,你指出我的错误 - 数据文件不好,并有一个小数。我对这个论坛有点新颖 - 我是否仍然将你的答案标记为正确/标记出来? – SeanVDH 2011-02-24 19:55:20

相关问题