Ouvrir mon DataReader???

SonOfGod7 Messages postés 11 Statut Membre -  
kuchi007 Messages postés 318 Statut Membre -
Bonjour,
Salut,
Voila j'ai un problème avec mon script,
Voici une methode de ma classe AccesData: cette methode me retourne un datareader.

public System.Data.Common.DbDataReader ExecuteReader(String CommandText, ref System.Data.Common.DbConnection conn)
{
System.Data.Common.DbCommand oDbCommand;
System.Data.Common.DbDataReader oDbDataReader;
try
{
conn.Open();
oDbCommand = this.CreateCommand(CommandText, conn, System.Data.CommandType.Text);

oDbDataReader = oDbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}

return oDbDataReader;
}
Voici le code et voici mon Main

static void Main(string[] args)
{
AccesData obj;
obj = AccesData.GetInstance();
System.Data.Common.DbConnection conn;
conn = obj.CreateConnection("System.Data.SqlClient", "initial catalog=data; data source=.;integrated security=true;");
System.Data.Common.DbDataReader Da ;
Da = obj.ExecuteReader("select * from data",ref conn);
conn.Open();

Console.Write("Le nombre de ligne changer est {0}", Da.Read());
while (Da.Read())
{
Console.WriteLine("de numero {0} et de nom {1}", Da["id"], Da["name"]);
}
conn.Close();
Console.ReadLine();
}
voici les detail de mon erreur

L'exception System.InvalidOperationException n'a pas été gérée
Message="Tentative d'appel de Read non valide lorsque le lecteur est fermé."
Source="System.Data"
StackTrace:
à System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
à System.Data.SqlClient.SqlDataReader.Read()
à test.Program.Main(String[] args) dans D:\Boss\Script\projet été\C# - 2SF\test1\test1\Program.cs:ligne 173
à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
à System.Threading.ThreadHelper.ThreadStart()
InnerException:
c'est quoi le Lecteur es ce le dataset .
Si oui comment l'ouvrir , je n'ai rien trouvé sur le net
A voir également:

2 réponses

kuchi007 Messages postés 318 Statut Membre 31
 
Salut,

Alors vu que je ne sais pas où est situé exactement l'erreur et du fait que j'oublie les bases...
Je vois que deux raisons possibles.

Après ton conn.Close() dans ton main, l'instruction Console.ReadLine() est elle toujours valide malgré la fermeture de la connexion???

Sinon l'autre chose que j'ai vu et c'est là que mes bases ne sont plus solides, c'est dans ta méthode tu déclares localement la variable oDbDataReader et tu la renvois à la fin de la méthode puis dans ton main tu exécutes des fonctions sur l'objet retourné.

Je ne sais plus en Java mais en C++ je suis quasiment sur que la portée de la variable reste locale et n'est plus valide en dehors de la méthode donc que dans ton main la ligne Da.Read() est invalide.
Le garbage collector ne supprime-t-il pas la référence à oDbDataReader une fois sorti de la méthode???

Je ne suis plus sur mais visiblement l'erreur est causée par un appel à une méthode Read() et j'aurais tendance à dire que cela vient du Da.Read().

Enfin voilà essayes de voir et dis moi d'ailleurs où tu en es ça m'intéresse :)
Bonne chance
0
SonOfGod7 Messages postés 11 Statut Membre
 
Salut kuchi007, desolé de repondre si tard .
Au juste , pour regler ce probleme , c'est enlevé conn.Close(), de ma fonction ExecuteReade.
Car un Datareader fonctionne en mode deconnecté et dès que tu ferme la connection il se perd apparemment.

Donc je ferme la connection dans le main.
0
kuchi007 Messages postés 318 Statut Membre 31
 
Ok merci bien donc c 'est bien une des choses que je trouvais bizarre ^^
Généralement lorsque tu fermes une connexion il est difficile de transmettre dessus ! :)
0