Bonjour à tous,
J'ai une petite question pour l'insert de données csv dans une table :
On m'envoie des fichiers csv avec une première ligne d’entête, seulement mon client change l'ordre des colonnes systématiquement (chaque semaine).
J'aimerai faire quelque chose d'un peu plus dynamique qui puisse me permettre de ne pas réécrire mes requêtes à chaque fois que l'ordre des
colonnes change.
Ci joint tout mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //Je récupère le contenu du CSV et je le lis dans un reader while (!reader.EndOfStream) { var line = reader.ReadLine(); var data = line.Split(';'); _maDal.ConsoliderDonnees(data); }
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 // La méthode qui INSERT OR UPDATE les données dans ma BDD public void ConsoliderDonnees(string[] data) { using (DbCommand cmd = GetProcedureStockeeCommande("dbo.INSERT_OR_UPDATE_DONNEES")) { cmd.CommandTimeout = TimeOut; for (int i = 0; i < data.Length; i++) { AddInParameter(cmd, string.Concat("data", i), data[i]); } ExecuteNonQuery(cmd); } }); }
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 //Ma ProcStoc CREATE PROCEDURE [dbo].[INSERT_OR_UPDATE_DONNEES] ( @data0 BIGINT, @data1 NVARCHAR(50), @data2 MONEY, @data3 NVARCHAR(50), @data4 INT ) AS BEGIN SET nocount ON; IF NOT EXISTS(SELECT * FROM donnee where donnee_id=@data0) INSERT INTO donnee (donnee_id,donnee_ref,donnee_prix,donnee_variable,Actif) VALUES (@data0,@data1,@data2,@data3,@data4) ELSE UPDATE donnee SET donnee_ref=@data1, donnee_prix=@data2, donnee_variable= @data3, Actif = @data4 WHERE donnee_id=@data0 END
Je veux donc juste récupérer la place du champs dans l’entête et mettre la valeur au bon endroit car dès fois @data3 est à la place de @data4. Existe-il un moyen de faire cela ?
Merci beaucoup d'avance
Partager