2015-01-15 35 views
0

我正在使用OracleBlukCopy將巨大的CSV文件轉儲到數據庫表中。這是我正在使用的代碼。當我運行這個時,我得到一個錯誤,說不能將NULL插入TBL_COL1,但我的CSV具有TBL_COL1的值。來自CSV的OracleBulkCopy - 無法插入空值列有值

經過研究,我得出結論,當TBL_COL1中有字符時它會發出錯誤。任何想法爲什麼?

DataTable datatable = TranslateCSVFileToDataTable(); 

using (OracleConnection connectiontodb = new OracleConnection(databaseconnectionstring)) 
{ 
    connectiontodb.Open(); 
    using (OracleBulkCopy copytothetable = new OracleBulkCopy(connectiontodb)) 
    { 
     copytothetable.ColumnMappings.Add("TBL_COL1", "TBL_COL1"); 
     copytothetable.ColumnMappings.Add("TBL_COL2", "TBL_COL2"); 
     copytothetable.ColumnMappings.Add("TBL_COL3", "TBL_COL3"); 
     copytothetable.DestinationTableName = "DESTINATION_TABLE"; 
     copytothetable.WriteToServer(datatable); 
    } 
} 


CREATE TABLE DESTINATION_TABLE 
(
    TBL_COL1     VARCHAR2(32) not null, 
    TBL_COL2     DATE not null, 
    TBL_COL3     DATE not null, 
) 


98987987987987987,6/23/2014,7/23/2014 
98987987987987987,7/23/2014,8/21/2014 
98987987987987987,8/21/2014,9/22/2014 
98987987987987987,9/22/2014,10/21/2014 
98987987987987987,10/21/2014,11/20/2014 
98987987987987987,11/20/2014,12/22/2014 
656666666666666ABC1234,1/8/2014,1/9/2014 
656666666666666ABC1234,1/9/2014,2/9/2014 
656666666666666ABC1234,2/9/2014,3/9/2014 
656666666666666ABC1234,3/9/2014,4/7/2014 
656666666666666ABC1234,4/7/2014,5/7/2014 
656666666666666ABC1234,5/7/2014,6/8/2014 
656666666666666ABC1234,6/8/2014,7/8/2014 
656666666666666ABC1234,7/8/2014,8/7/2014 
656666666666666ABC1234,8/7/2014,9/8/2014 
656666666666666ABC1234,9/8/2014,10/7/2014 
656666666666666ABC1234,10/7/2014,11/9/2014 
656666666666666ABC1234,11/9/2014,12/7/2014 
777777777777777XYZ1234,5/7/2014,6/8/2014 
777777777777777XYZ1234,6/8/2014,7/8/2014 
777777777777777XYZ1234,7/8/2014,8/7/2014 
777777777777777XYZ1234,8/7/2014,9/8/2014 
777777777777777XYZ1234,9/8/2014,10/7/2014 
777777777777777XYZ1234,10/7/2014,11/9/2014 
777777777777777XYZ1234,11/9/2014,12/7/2014 
+0

可能你的csv中有空行嗎? – 2015-01-15 16:21:30

+0

你嘗試過調試你的數據表...檢查你的數據表是否有任何值。 – prasy 2015-01-15 16:28:55

+0

@ Politank-Z控制文件中的TRAILING NULLCOLS – CoolArchTek 2015-01-15 16:43:33

回答

1

你可以試試Oracle事務提交。也許這對你有幫助。

using (OracleConnection connectiontodb = new OracleConnection(databaseconnectionstring)) 
    { 
     connectiontodb.Open(); 
     using (OracleBulkCopy copytothetable = new OracleBulkCopy(connectiontodb)) 
     { 
    OracleTransaction tran = connectiontodb.BeginTransaction(IsolationLevel.ReadCommitted); 
      try 
      { 
      copytothetable.ColumnMappings.Add("TBL_COL1", "TBL_COL1"); 
      copytothetable.ColumnMappings.Add("TBL_COL2", "TBL_COL2"); 
      copytothetable.ColumnMappings.Add("TBL_COL3", "TBL_COL3"); 
      copytothetable.DestinationTableName = "DESTINATION_TABLE"; 
      copytothetable.WriteToServer(datatable); 
      tran.Commit(); 
      } 
      catch 
      { 
      tran.Roolback(); 
      } 
     } 
    } 
2

你必須創建數據表列類似於DESTINATION_TABLE列,然後做列映射

DataTable datatable; 
      datatable = new DataTable("temptable"); 
      datatable.Columns.Add("TBL_COL1 "); 
      datatable.Columns.Add("TBL_COL2 "); 
      datatable.Columns.Add("TBL_COL3"); 
using (OracleBulkCopy copytothetable = new OracleBulkCopy(connectiontodb)) 
{ 
    copytothetable .DestinationTableName = "DESTINATION_TABLE"; 
    foreach (DataRow row in table.Rows) 
    { 
     foreach (DataColumn col in datatable.Columns) 
     { 
     if (row[col] != DBNull.Value) 
     { 
      copytothetable.ColumnMappings.Add(col.ColumnName, col.ColumnName); 
      } 
     } 
    } 
    copytothetable.WriteToServer(datatable); 
}