Bonjour,

Je suis coincé avec mon importateur CSV que j'essaie de programmer.

J'ai trouvé un tuto sur un site, mais je coince à l'adapter à mon besoin.

J'ai un CSV avec différents champs, chaque colonne ayant une en tête.

Je veux charger ce CSV dans ma base SQL pour ça j'ai donc un streamreader qui me découpe mon CSV en DataTable

ensuite la méthode préconisée dans le tuto c'est un Bulkcopy.

Le seul problème c'est que je n'arrive pas à trouver d'infos sur le fonctionnement de cette méthode et qu'elle renvoie des erreurs pas très explicites.

voici mon code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
public ActionResult Importcsv()
        {
            return View();
        }
 
        [HttpPost]
        public ActionResult Importcsv(HttpPostedFileBase FileUpload)
        {
            DataTable dt = new DataTable();
 
            if (FileUpload.ContentLength > 0)
            {
                string fileName = Path.GetFileName(FileUpload.FileName);
                string path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                try
                {
                    FileUpload.SaveAs(path);
                    dt = ProcessCSV(path);
                    ViewData["Feedback"] = ProcessBulkCopy(dt);
 
                }
                catch (Exception ex)
                {
                    ViewData["Feedback"] = ex.Message;
                }
 
            }
            else
            {
                ViewData["Feedback"] = "Sélectionnez un fichier";
            }
            dt.Dispose();
 
            return View("Importcsv", ViewData["Feedback"]);
        }
 
 private static String ProcessBulkCopy(DataTable dt)
        {
            string Feedback = string.Empty;
            string connString = ConfigurationManager.ConnectionStrings["BagatellesDBContext"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                using (var copy = new SqlBulkCopy(conn))
                {
                    copy.DestinationTableName = "Articles";
 
                    copy.BatchSize = dt.Rows.Count;
                    try
                    {
                        copy.WriteToServer(dt);
                        Feedback = "Chargement effectué";
                    }
                    catch (Exception ex)
                    {
                        Feedback = ex.Message;
                    }
                }
 
                return Feedback;
            }
et voici l'erreur renvoyée lors du chargement du CSV:

Impossible de convertir la valeur de type String fournie pour la source de données en type int de la colonne cible spécifiée.

La seul colonne qui puisse être concernée est ma colonne de prix.

Faut-il exclure l'en-tête du bulkcopy pour éviter des erreurs de cast?

Mis dans ce cas comment faire pour qu'il injecte les données dans les bonnes cases sachant que mon CSV ne contient pas toutes les colonnes de ma base, et pas forcément dans le même ordre en plus.

Merci d'avance pour votre aide.