nagaD.scar
Messages postés4272Date d'inscriptionsamedi 8 septembre 2007StatutMembreDernière intervention 4 janvier 2023
-
11 déc. 2013 à 13:18
nagaD.scar
Messages postés4272Date d'inscriptionsamedi 8 septembre 2007StatutMembreDernière intervention 4 janvier 2023
-
26 déc. 2013 à 17:01
Bonjour à tous.
je me tourne vers vous car j'ai un soucis avec mon reader qui déclenche l'exeption
Fatal error encountered during data read.
sans (à prioris) raison valable ...
Dans un premier temps, ce qui concerne la connexion fonctionne, ainsi que le query. Par contre, durant la lecture (donc pas dès que je lis mais au bout d'un moment), l'exception apparaît.
public IEnumerable<string> getRes()
{
if (!bIsOk)
{
#region gestion
if (Erreur != "")
{
Exception e = new Exception(Erreur);
throw e;
}
else
{
Exception e = new Exception("PAS DE REQUETE");
throw e;
}
#endregion
}
string res = "";
int nbChamps = reader.FieldCount - 1;
while (reader.Read())
{
res = "";
for (int i = 0; i <= nbChamps; i++)
res += reader.GetValue(i) + ";";
yield return res;
}
reader.Dispose();
reader.Close();
bIsOk = false;
Erreur = "";
}
l'exception apparait au niveau du while :
while (reader.Read())
mais, je me répète, pas lors de la première itération.
Deux points à rajouter :
- j'utilise ces méthodes dans d'autres parties sans soucis
- ma requête récupère deux éléments : une chaine de 10 caractère et un identifiant
si quelqu'un à une idée ... ou si d'autre infos vous seraient nécessaires, demandez =)
merci d'avance.
naga
A voir également:
Fatal error encountered during command execution
Mysqldatareader c# - Meilleures réponses
Mysql fatal error encountered during data read - Meilleures réponses
cs_Robert33
Messages postés834Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention14 janvier 201733 20 déc. 2013 à 18:09
Bonsoir
Lorsque tu dis "Pas lors de la première itération" veux-tu dire que ça plante pendant la première boucle While{} ou lors d'un second appel ?
Dans le deuxième cas cela serait normal si entre temps tu n'as pas rappelé un ExecuteReader() pour remplir de nouveau le DataReader.
Si non quelle est le message exact de l'exception ?
nagaD.scar
Messages postés4272Date d'inscriptionsamedi 8 septembre 2007StatutMembreDernière intervention 4 janvier 202317 22 déc. 2013 à 00:31
salut,
non je lit sur le même reader (une seule requête), et l'exception se déclenche ensuite, au bout d'un certain nombre de lecture.
je n'ai moyen de te refaire l'exception ce week end, je lancerai mon appli lundi mais je ne sais pas combien de temps ca va prendre. Enfin il n'y avait pas plus d'info que le message que j'ai donné il me semble, je te redirai.
nagaD.scar
Messages postés4272Date d'inscriptionsamedi 8 septembre 2007StatutMembreDernière intervention 4 janvier 202317 23 déc. 2013 à 14:16
salut
j'ai donc tout démarré ce matin, actuellement ca tourne. J'ai quand même ajouté, au départ de ma fonction
query
la fermeture du reader si'il ne l'est pas. Normalement il doit être fermé par la lecture des éléments, mais le cas où je n'avais pas de résultat, laissait le reader ouvert (et bien sûr je ne lisais pas).
L'exception que j'avais donné ne correspond pas à ce problème, mais en résolvant celui ci, peu être que celui de départ était en relation avec lui.
nagaD.scar
Messages postés4272Date d'inscriptionsamedi 8 septembre 2007StatutMembreDernière intervention 4 janvier 202317 26 déc. 2013 à 07:59
Salut !
J'ai réussi à récupérer l'exception (après 48 h de traitement, dont 90% concerne du requêtage avec ce même connecteur qui pose problème).
Le message complet est donc celui que j'avais donné :
Fatal error encountered during command execution.
le stack :
at connBaseSQL.cMySql.<getRes>d__0.MoveNext() at pFusionFicVin.cImportFicVinSQL.finalize() at pFusionFicVin.cImportFicVinSQL.import() at pFusionFicVin.f_main.th_import() at pFusionFicVin.f_main.<btn_fusion_Click>b__0() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
il n'y a pas plus d'info. Ce que je peux rajouter c'est que l'exception est créé lors du
ExecuteReader
et qu'elle est ensuite remontée par ma méthode getRes => c'est donc à l'interrogation qu'il y a un soucis.
si tu as une idée, je seche un peu =/
merci.
naga
Vous n’avez pas trouvé la réponse que vous recherchez ?
Pas vraiment d'idée, il semblerait que l'exception provienne du connecteur ou de la base, pas de ton code; les moteurs de bases de données prennent parfois des décisions impitoyables lorsqu'ils ont besoin d'espace
Si le nombre d'enregistrements retournés par la requête n'est pas important il vaudrait mieux faire une fonction "tout-en-un", pour éviter d'avoir des connexions ouvertes, par ailleurs je n'aime pas trop l'utilisation du "yield" pour les mêmes raisons.
genre:
public IEnumerable<string> getRes(string sQuery, string connectionString)
{
List<string> StringResults = new List<string>();
Erreur = string.Empty;
try
{
using (DbConnection connection = new MySqlConnection(connectionString))
{
connection.Open();
DbCommand command = new MySqlCommand();
command.CommandText=sQuery;
command.Connection=connection;
using (DbDataReader reader = command.ExecuteReader())
{
if (!reader.HasRows)
return null;
while (reader.Read())
{
string res = string.Empty;
for (int i = 0; i < reader.FieldCount; i++)
res += reader.GetValue(i) + ";";
StringResults.Add(res);
}
return StringResults;
}
}
}
catch (Exception ex)
{
Erreur = ex.Message.ToString();
return null;
}
}
Bob.
C# is amazing, enjoy it!
nagaD.scar
Messages postés4272Date d'inscriptionsamedi 8 septembre 2007StatutMembreDernière intervention 4 janvier 202317 26 déc. 2013 à 16:59
ok donc je n'aurai à prioris pas le main là dessus =/
Bon mon appli à un système de sauvegarde histoire de libérer le poste si besoin, j'ai donc rajouté mon exception pour pouvoir reprendre mon travail.
Dans mon cas j'utilise le yield pour plusieurs raisons, la première étant que je ne peux pas stocker les resultat dans la ram vu que je traite un nombre très important de données . La seconde raison étant que je préfère avoir mon objet et ne pas traiter en direct afin de pouvoir gérer une seule fois certaines exceptions.
merci en tout cas, tant pis je me débrouillerai avec ma sauvegarde donc =)
bne aprem ;)
naga
nagaD.scar
Messages postés4272Date d'inscriptionsamedi 8 septembre 2007StatutMembreDernière intervention 4 janvier 202317 26 déc. 2013 à 17:01
ah oui, et au départ je stockai justement les résultats dans des fichiers temporaire afin d'éviter les dépassement de mémoire (pour rendre transparent le fait de récupérer dans un fichier ou la liste).