SqlBulkCopy - datarows vuoti in db2table

c# csv sqlbulkcopy

Domanda

ora finalmente ho potuto scrivere le righe del mio csv (un po ') nel tavolo. Aggiunge le 7 righe del csv, ma senza dati. L'unica cosa che imposta è l'id, ma è comunque autoincrementato. I dati fuori dal csv non arrivano nella tabella.

 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;
        }

    }

Risposta accettata

Non sono sicuro del tuo sbc.ColumnMappings. Penso che sia solo necessario se il tuo datatable non riflette la struttura della tua tabella db2. Nel mio codice elaboro il datatable per avere lo stesso numero e ordine di colonne della tabella DB2. Non uso ColumnMappings.

2 °: il tuo sbc.DestinationTableName. Io uso qui una stringa con lo schema esatto e il nometabella da DB2. DestinationTableName = "DB2-Schema.DB2-Tablename"


Risposta popolare

Su quale versione è in esecuzione DB2? Bulkcopy è supportato dalla versione 9.7



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché