SqlBulkCopy - vide datarows dans db2table

c# csv sqlbulkcopy

Question

Maintenant, j'ai enfin réussi à écrire les lignes de mon csv (un peu) dans la table. Il ajoute les 7 lignes du csv, mais sans données. La seule chose qu'il définit est l'identifiant, mais il est auto-incrémenté de toute façon. Les données du CSV n'arrivent pas dans la table.

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

    }

Réponse acceptée

Je ne suis pas sûr de vos sbc.ColumnMappings. Je pense que c'est juste nécessaire si votre datatable ne reflétait pas la structure de votre table db2. Dans mon code, je traite le datatable pour avoir le même nombre et le même ordre de colonnes que la table DB2. Je n'utilise pas ColumnMappings.

2e: votre sbc.DestinationTableName. J'utilise ici une chaîne contenant exactement le schéma et le nom de table de DB2. DestinationTableName = "DB2-Schema.DB2-Tablename"


Réponse populaire

Sur quelle version fonctionne DB2? Bulkcopy est supporté à partir de la version 9.7



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi