2014-03-28 22 views
0

現在我終於寫了我的csv(有點)的行到表中。它確實添加了csv的7行,但沒有數據。它唯一設置的是id,但是這是自動增加的。來自csv的數據不會到達表格中。SqlBulkCopy - db2table中的空datarows

static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader, string csvSelection) 
     { 
      string header= isFirstRowHeader ? "Yes" : "No"; 

      string pathOnly = Path.GetDirectoryName(path); 
      string fileName = Path.GetFileName(path); 
      List<string> headerList = getHeader(fileName); 
      string sql = @"SELECT " + "*" + " FROM [" + fileName + "]"; 
      //string sql = @"SELECT * FROM [" + fileName + "];"; 

      using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + ";Extended Properties=\"Text;HDR=" + headerList + ";FMT=Delimited(;)\"")) 
      using (OleDbCommand command = new OleDbCommand(sql, connection)) 
      using (OleDbDataAdapter adapter = new OleDbDataAdapter(command)) 
      { 
       DataTable dataTable = new DataTable(); 
       dataTable.Locale = CultureInfo.CurrentCulture; 
       foreach (var item in headerList) 
       { 
        dataTable.Columns.Add(item); 
       } 

       adapter.Fill(dataTable); 
       writeSchema(dataTable.Columns, pathOnly, fileName); 
       return dataTable; 
      } 

     } 

public static Boolean BatchBulkCopy(DataTable dt, string destTable, List<string> columnMapping, IBM.Data.DB2.DB2Connection connection, int batchSize) 
     { 
      DataTable dtInsertRows = dt; 
      using (IBM.Data.DB2.DB2BulkCopy sbc = new IBM.Data.DB2.DB2BulkCopy(connection, IBM.Data.DB2.DB2BulkCopyOptions.TableLock)) 
      { 
       sbc.DestinationTableName = "\"" + destTable + "\""; 

       foreach (var mapping in columnMapping) 
       { 
        var split = mapping.Split(new[] { ',' }); 
        sbc.ColumnMappings.Add("\"" + split.First() + "\"", "\"" + split.Last() + "\""); 
       } 
       try{ 
        sbc.WriteToServer(dtInsertRows); 
        sbc.Close(); 
       } 
       catch(Exception e){ 
        System.Console.WriteLine(e.ToString()); 
       } 
      } 
      connection.Close(); 
      return false; 
     } 
private static void writeSchema(DataColumnCollection columns, string csvDir, string csvFileName) 
     { 
      FileStream fsOutput = 
        new FileStream(csvDir + "\\schema.ini", 
             FileMode.Create, FileAccess.Write); 
      StreamWriter srOutput = new StreamWriter(fsOutput); 

      srOutput.WriteLine("[" + csvFileName + "]"); 
      int i = 1; 
      foreach (DataColumn item in columns) 
      { 
       srOutput.WriteLine("Col" + i + "=\"" + item.ToString() + "\" Text"); 
       i++; 
      } 
      srOutput.Close(); 
      fsOutput.Close(); 
     } 

     private static List<string> getHeader(string fileName) 
     { 
      string fullpath = @ImportPath + "\\" + fileName; 
      List<string> header = new List<string>(); 
      var reader = new StreamReader(File.OpenRead(fullpath)); 

      while (!reader.EndOfStream) 
      { 
       var line = reader.ReadLine(); 
       var values = line.Split(';'); 

       foreach (var spalte in values) 
       { 
        header.Add(spalte); 
       } 
       reader.Close(); 
       return header; 
      } 
      return null; 
     } 

    } 

回答

0

我不確定你的sbc.ColumnMappings。如果你的數據表沒有反映你的db2表的結構,我認爲這是需要的。在我的代碼中,我處理數據表的順序與DB2表的列號相同。我不使用ColumnMappings。

2nd:your sbc.DestinationTableName。我在這裏使用了一個具有來自DB2的確切模式和表名的字符串。 DestinationTableName =「DB2-Schema.DB2-Tablename」

0

運行在哪個版本的DB2上?從版本9.7開始支持批量拷貝