Bonjour à tous et toutes,
je bloque sur la solution pour importer une table csv de 40 champs dans un programme c# et le traiter en sqlCE par la suite.
1/ Comment ouvrir un fichier en c#
2/ Comment creer les lignes.
Merci d'avance.
Version imprimable
Bonjour à tous et toutes,
je bloque sur la solution pour importer une table csv de 40 champs dans un programme c# et le traiter en sqlCE par la suite.
1/ Comment ouvrir un fichier en c#
2/ Comment creer les lignes.
Merci d'avance.
Bonjour,
- La première chose à faire est de charger les données du fichier csv dans un DataTable.
- Ensuite vous créer une deuxième connexion et vous parser les données du datatable pour effectuer les INSERT dans la db sqlCE.
Comment utiliser une datatable ?
J'ai créé la requete suivante :
A l’exécution, j'ai une erreur : "les données ont été tronquées"Code:
1
2
3
4
5 INSERT INTO Aliment (ORIGGPFR, ORIGFDCD, ORIGFDNM, Sodium, Fer, Proteines, [Proteines brutes], Glucides, Sucres, [Energie(kj/100g)], [Energies(kcalories/100g)], Fibres, Eau, Lipides, [AG Satures], [Vitamine D], [Vitamine E ], [Vitamine K ], [Vitamine C ], [Vitamine B2 ], [Vitamine B3 ], [Vitamine B5 ], [Vitamine B6 ], [Vitamine B12 ], [Vitamine B9 ], [Alcool ], [Cholestérol ]) VALUES ('Abats', 40003, 'Cervelle. agneau. cuite', '130 ', '3.53 ', '10.8 ', '10.8', '0.8', '-', '523', '126', '0', '77.3', '8.8', '2.6', '-', '-', '-', '12', '0.24', '2.47', '0.99', '0.11', '9.25', '5', '0', '2080')
Voici la requete en c# :
Code:
1
2
3 commande.CommandText = "INSERT INTO Aliment (ORIGGPFR, ORIGFDCD, ORIGFDNM, Sodium, Fer, Proteines, [Proteines brutes], Glucides, Sucres, [Energie(kj/100g)], [Energies(kcalories/100g)], Fibres, Eau, Lipides, [AG Satures], [Vitamine D], [Vitamine E ], [Vitamine K ], [Vitamine C ], [Vitamine B2 ], [Vitamine B3 ], [Vitamine B5 ], [Vitamine B6 ], [Vitamine B12 ], [Vitamine B9 ], [Alcool ], [Cholestérol ]) VALUES('" + data[1] + "'," + data[2] + ", '" + data[3] + "', '" + data[4] + "', '" + data[10] + "','" + data[15] + "', '" + data[16] + "', '" + data[17] + "', '" + data[18] + "', '" + data[22] + "', '" + data[23] + "', '" + data[25] + "', '" + data[26] + "', '" + data[27] + "', '" + data[28] + "', '" + data[47] + "', '" + data[48] + "', '" + data[49] + "', '" + data[50] + "', '" + data[52] + "', '" + data[53] + "', '" + data[54] + "', '" + data[55] + "', '" + data[56] + "', '" + data[57] + "', '" + data[58] + "', '" + data[60] + "')";
Bonjour,
Wouah, tu fais le concours de la concaténation de chaîne la plus longue du monde ?
Etant donné la manière dont tu procèdes, il est normal que tu aies des erreurs. Regarde du côté des requêtes paramétrées, cela t'évitera bien des ennuis de concaténation.
+ 1 avec calagan99.
Sinon peux tu nous donner le schéma de ta table Aliment (Nom des champs, types, et tailles)
La table contient 1/3 des champs de cette table :
http://www.anses.fr/TableCIQUAL/
tous sont des nvarchar a part la clé primaire data[2] qui est un int
D'accord, je viens de jeter un coup d’œil au fichier csv dispo sur le site ainsi que à la base de données. Je suppose donc que le fichier .csv dont vous récupérer les données proviennent de cette source, et au vu de votre requête, vous essayer de faire un insert des données dans une autre base de données (donc en SqlCe).
Ce qui m’intéresserait de voir c'est le schéma de cette base de destination.
Comment je peux faire pour l'exporter ?
Je la recopie manuellement ?
Si ça peut t'aider voilà une classe que j'ai faite qui permet l'insertion, la lecture la supression dans une bdd SQL ServerCE:
et voici la classe personne au cas ou :Code:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171 public class PersonneRepository : IPersonneRepository { private string ConnectionString { get { return Properties.Settings.Default.PersonneConnectionString; } } public int AjouterPersonne(Personne personne) { int result = 0; using (SqlCeConnection con = new SqlCeConnection(ConnectionString)) { SqlCeCommand commande = AjouterPersonneBDD(personne, con); con.Open(); result = commande.ExecuteNonQuery(); } return result; } public int AjouterPersonne(List<Personne> personnes) { int result = 0; using (SqlCeConnection con = new SqlCeConnection(ConnectionString)) { con.Open(); foreach (var item in personnes) { SqlCeCommand commande = AjouterPersonneBDD(item, con); result += commande.ExecuteNonQuery(); } } return result; } public Personne ObtenirParId(int id) { Personne personne = new Personne(); using (SqlCeConnection con = new SqlCeConnection(ConnectionString)) { string requete = "Select * from personne where Id=@id"; SqlCeParameter paramId = new SqlCeParameter("@id", id); SqlCeCommand commande = con.CreateCommand(); commande.CommandText = requete; commande.Parameters.Add(paramId); con.Open(); using (SqlCeDataReader rd = commande.ExecuteReader()) { while (rd.Read()) { personne = CreerPersonne(rd); } } } return personne; } public List<Personne> ObtenirTous() { List<Personne> personnes = new List<Personne>(); using (SqlCeConnection con = new SqlCeConnection(ConnectionString)) { string requete = "Select * from personne"; SqlCeCommand commande = con.CreateCommand(); commande.CommandText = requete; con.Open(); using (SqlCeDataReader rd = commande.ExecuteReader()) { while (rd.Read()) { Personne personne = CreerPersonne(rd); personnes.Add(personne); } } } return personnes; } private Personne CreerPersonne(SqlCeDataReader reader) { Personne personne = new Personne(); int indexColonneId = reader.GetOrdinal("id"); if (!reader.IsDBNull(indexColonneId)) { personne.Id = reader.GetInt32(indexColonneId); } //personne.Id = (int)reader["id"]; personne.Nom = reader["nom"].ToString(); personne.Prenom = reader["prenom"].ToString(); personne.DateDeNaissance = (DateTime)reader["datedenaissance"]; personne.VilleDeNaissance = reader["villedenaissance"].ToString(); return personne; } private static SqlCeCommand AjouterPersonneBDD(Personne personne, SqlCeConnection con) { string requete = "Insert into personne(nom,prenom,datedenaissance,villedenaissance) values(@nom,@prenom,@datedenaissance,@villedenaissance)"; SqlCeParameter paramNom = new SqlCeParameter("@nom", personne.Nom); SqlCeParameter paramPrenom = new SqlCeParameter("@prenom", personne.Prenom); SqlCeParameter paramDate = new SqlCeParameter("@datedenaissance", personne.DateDeNaissance); SqlCeParameter paramVille = new SqlCeParameter("@villedenaissance", personne.VilleDeNaissance); SqlCeCommand commande = con.CreateCommand(); commande.CommandText = requete; commande.Parameters.Add(paramNom); commande.Parameters.Add(paramDate); commande.Parameters.Add(paramPrenom); commande.Parameters.Add(paramVille); return commande; } public int ObtenirNbPersonne() { int nbPersonne = 0; using (SqlCeConnection con = new SqlCeConnection(ConnectionString)) { string requete = "Select count(*) from personne"; SqlCeCommand commande = con.CreateCommand(); commande.CommandText = requete; con.Open(); nbPersonne = (int)commande.ExecuteScalar(); } return nbPersonne; } public int EffacerDoublons(List<int> id) { int result = 0; using (SqlCeConnection con = new SqlCeConnection(ConnectionString)) { con.Open(); foreach (var item in id) { SqlCeCommand commande = SupprimerDoublonBDD(item, con); result += commande.ExecuteNonQuery(); } } return result; } private static SqlCeCommand SupprimerDoublonBDD(int id, SqlCeConnection con) { string requete = "Delete from personne where Id=@id"; SqlCeParameter paramId = new SqlCeParameter("@id", id); SqlCeCommand commande = con.CreateCommand(); commande.CommandText = requete; commande.Parameters.Add(paramId); return commande; } }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 public class Personne { public int Id { get; set; } public string Nom { get; set; } public string Prenom { get; set; } public DateTime DateDeNaissance { get; set; } public string VilleDeNaissance { get; set; } }
Merci pour les classes, je vais essayer de les utiliser. :ccool:
Si ta db fait moins que 2 Mb tu peux la zippé et l'attaché à une réponse à la discussion.
Je l'ai zipé et attaché, elle est vide par contre...
Bonsoir,
Je ne connais pas bien SqlServerCe, par contre dans le fichier .cs composant votre Zip je ne vois rien qui réfère une table Aliment comme dans votre requête, est ce normal.
Un petit truc qui prend du temps mais qui pourrais aussi vous aider, c'est d'essayer des inserts mais en commençant avec 5 champs par exemple, puis vous en mettez quelque un de plus, histoire de localiser celui qui pose problème.
Je jetterais un œil plus approfondis demain au fichier que vous m'avez envoyé
J'ai envoyé le projet complet
Bonsoir,
Programme déja bien avancé et pas fait du tout. Mais qu'elle est la manipulation à réaliser pour provoquer votre erreur "les données ont été tronquées" ?
J'ai envoyé le mauvais projet, voici le bon en pj
Je me disais bien que je trouvais pas votre requête ;-) Je jetterais un œil ce soir
Merci d'avance ! :)
Alors ca n'a pas été simple mais j'ai un début d'explication à ton problème.
Tout d'abord je n'ai pas su afficher le schéma de ta DB à l'aide de Visual Studio 2012 (Alors que cela fonctionne dans le premier projet que tu m'as envoyé mais je ne suis pas encore habitué avec cette nouvelle version donc cela vient peut-être de moi).
Donc pour avoir un aperçu des colonnes se trouvant dans la table Aliment j'ai utilisé le code suivant :
qui m'a permet de charger le contenu de la table ainsi que son schéma dans un datatable contenu dans le dataset. Ce qui m'a permet d'explorer le schéma en passant en debug et en utilisant un espion.Code:
1
2
3
4
5 SqlCeDataAdapter da = new SqlCeDataAdapter("select * from Aliment", connexion); DataSet ds = new DataSet(); da.Fill(ds, "Aliment");
Pour le reste plusieurs remarques :
- Pour la concaténation d'un certain nombre de string, plutôt passé par un StringBuilder. Tu gagneras en performance surtout que dans ce cas ci c'est dans une boule.
- Je ne comprend pas pourquoi il y a tant de '\n' dans la constitution de ta requête. Il y a 27 champs que tu essaies d'ajouter et 27 variables data[x].
- Si tu as créé ton schéma de table toi même, même si c'est possible, éviter les espaces dans le nom des champs, et surtout les caractères spéciaux comme les caractères accentués comme dans [Cholestérol] ou [Energies(kcalories/100g)].
- Placer ton code dans un try catch pour trapper l'erreur et analyser le contenu de l'exception t'aurais mis sur la voie (perso m'a fallu le temps aussi pour prendre l'habitude de le faire).
- Comme on te l'a préciser dans un poste précédent, utiliser les requêtes paramétrés peut t'éviter bcp de problème et rendre ton code plus lisible.
Au sinon j'ai remanié un peu ton code sans rajouter pour l'instant l'utilisation du StringBuilder et des requêtes paramétrées, car dans ce cas cela n'aurait pas aidé :
Comme tu le remarqueras dans le début de la création de la requête, un certain nombre des champs que tu essaies de remplir n'existe simplement pas dans ta table aliment. Les lignes qui devait remplir la clauses Values sont commentées.Code:
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 commande.CommandText = "INSERT INTO Aliment (ORIGGPFR,ORIGFDCD,ORIGFDNM,Sodium,Fer,Proteines,[Proteines brutes], Glucides, Sucres,"; // Colonnes qui n'existe pas dans la DB : [Vitamine D], [Vitamine E ], [Vitamine K ], [Vitamine C ], [Vitamine B2 ], [Vitamine B3 ], // [Vitamine B5 ], [Vitamine B6 ],[Vitamine B12 ], [Vitamine B9 ],[Alcool], [Cholestérol] commande.CommandText += "[Energie(kj/100g)], [Energies(kcalories/100g)],Fibres,Eau,Lipides,[AG Satures]) "; commande.CommandText +="VALUES("; // ORIGGPFR commande.CommandText += "'" + data[1].ToString() + "',"; // ORIGFDCD commande.CommandText += "'" + data[2].ToString() + "',"; // ORIGFDNM commande.CommandText += "'" + data[3].ToString() + "',"; // Sodium commande.CommandText += "'" + data[4].ToString() + "',"; // Fer commande.CommandText += "'" + data[10].ToString() + "',"; // Proteines commande.CommandText += "'" + data[15].ToString() + "',"; // [Proteines brutes] commande.CommandText += "'" + data[16].ToString() + "',"; // Glucides commande.CommandText += "'" + data[17].ToString() + "',"; // Sucres commande.CommandText += "'" + data[18].ToString() + "',"; // [Energie(kj/100g)] commande.CommandText += "'" + data[22].ToString() + "',"; // [Energies(kcalories/100g)] commande.CommandText += "'" + data[23].ToString() + "',"; // FibreS commande.CommandText += "'" + data[25].ToString() + "',"; // Eau commande.CommandText += "'" + data[26].ToString() + "',"; // Lipides commande.CommandText += "'" + data[27].ToString() + "',"; // [AG Satures] commande.CommandText += "'" + data[28].ToString() + "',"; // [Vitamine D] // commande.CommandText += "'" + data[47].ToString() + "'"; // [Vitamine E ] // commande.CommandText += "'" + data[48].ToString() + "',"; // [Vitamine K ] // commande.CommandText += "'" + data[49].ToString() + "',"; // [Vitamine C ] // commande.CommandText += "'" + data[50].ToString() + "',"; // [Vitamine B2 ] // commande.CommandText += "'" + data[52].ToString() + "',"; // [Vitamine B3 ] // commande.CommandText += "'" + data[53].ToString() + "',"; // [Vitamine B5 ] // commande.CommandText += "'" + data[54].ToString() + "',"; // [Vitamine B6 ] // commande.CommandText += "'" + data[55].ToString() + "',"; // [Vitamine B12 ] // commande.CommandText += "'" + data[56].ToString() + "',"; // [Vitamine B9 ] // commande.CommandText += "'" + data[57].ToString() + "',"; // [Alcool ] // commande.CommandText += "'" + data[58].ToString() + "'"; // [Cholestérol ] //commande.CommandText += "'" + data[60].ToString() + "'";
Cette requête s'exécute mais crée encore des exceptions dans certains cas. Je n'ai pas eu le temps d'analyser, mais je pense que c'est du à la méthode ToString utilisé sur des champs vide.
Voila un début d'explication pour tes soucis, je pense encore un peu gratter mais la il est un peu tard ;-) mais je pense que tu as matière à avancer vers la solution.
En espérant avoir été clair dans mes explications.