Bonjour,

J'ai fait un petit programme de mise à jour pour les données clientes de mon entreprises.
Ce programme, insert les données de mise à jour dans une base de publication, pour les appliquer ensuite sur la base de production.

Le programme marchait jusque là fort bien, mais lors de l'application de la dernière mise à jour générée, incluant une nouvelle table dans la configuration, il y a le message d'erreur suivant:

Le ColumnMapping fourni ne correspond à aucune colonne de la source ou de la destination.
Surpris, j'ai regardé en debuggant l'outil, et le mapping était plus que correct.

J'ai fini par identifier l'erreur en remarquant que dans la configuration de la table dans la mise à jour, il y avait une différence dans le nom du champ dans la base et dans la configuration (un l minuscule dans l'un, un L majuscule dans l'autre).

Après changement du nom dans la base, la mise à jour passe sans soucis.

Maintenant, n'étant pas à l'abri d'une nouvelle erreur de ce type, j'aimerais savoir s'il y a un moyen de rendre le bulk insert insensible à la casse.

Voici le code que j'utilise actuellement:

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
 
public static void fillManuallyDBPub(ConnectionADO conn, Table<IChangeable> t,string dbpub,int idmaj)
        {
            if (conn.Connect() && t.tasks.Count>0)
            {
                conn.beginTask();
 
                //nettoyage d'eventuels parasites dans la base de publication
                new SqlCommand("DELETE FROM " + dbpub + ".dbo." + t.Name+" WHERE maj_id="+idmaj+" or maj_id<"+(idmaj-5), 
                    conn.Connector){CommandTimeout = 600}.ExecuteNonQuery();
 
                //preparation du bulkinsert
                var bulker = new SqlBulkCopy(conn.Connector);
                bulker.BulkCopyTimeout = 1800;
                bulker.BatchSize = 10000;
                bulker.DestinationTableName = dbpub + ".dbo." + t.Name;
 
                //creation du datatable
                var dt = new DataTable(t.Name);
 
                for (var i = 0; i < t.all.Count; i++)
                {
                    dt.Columns.Add(t.all[i].name, GetTypeFromSql(t.all[i].type));
                    bulker.ColumnMappings.Add(t.all[i].name, t.all[i].name);
                }
                dt.Columns.Add("maj_type",Type.GetType("System.String"));
                dt.Columns.Add("maj_id", Type.GetType("System.Int32"));
                bulker.ColumnMappings.Add("maj_type", "maj_type");
                bulker.ColumnMappings.Add("maj_id", "maj_id");
 
                //remplissage du datatable
                for (var i = 0; i < t.tasks.Count;i++)
                {
                    var dr = dt.NewRow();
 
                    for(var j=0;j<t.all.Count;j++)
                    {
                        dr[t.all[j].name] = t.tasks[i].toDoList[j];
                    }
                    dr["maj_id"] = idmaj;
                    dr["maj_type"] = t.tasks[i].type == ChangingType.DELETE ? 'D' :
                        t.tasks[i].type == ChangingType.INSERT? 'I' : 'U';
 
                    dt.Rows.Add(dr);
                }
                dt.AcceptChanges();
 
                //go go go
                bulker.WriteToServer(dt);
 
                conn.endTask();
                conn.disConnect();
            }
        }
J'ai modifié ça pour tester, mais ça ne marche pas:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
                //creation du datatable
                var dt = new DataTable(t.Name){CaseSensitive = false};
Des idées pour un bulk insert insensible à la casse?