Ouvrir mon DataReader???

Signaler
Messages postés
9
Date d'inscription
jeudi 14 décembre 2000
Statut
Membre
Dernière intervention
11 juillet 2009
-
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-

2 réponses

Messages postés
9
Date d'inscription
jeudi 14 décembre 2000
Statut
Membre
Dernière intervention
11 juillet 2009

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
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
28
Bonjour,

en fait c'est la connexion qui est fermée lorsque tu essayes de lire le reader.
La méthode Execute reader ne charge pas le DataReader completement, mais garde une sorte de curseur sur la connexion, le fait de fermer la connexion va fermer le datareader.

comme tu positionnes "CommandBehavior.CloseConnection" sur l'execution, la connexion sera fermée lorsque tu fermeras le reader.
enleve donc "conn.Close()" de ton finally.

autre remarques:
-inutile de mettre un "ref" devant le parametre connexion, les objets sont par défaut passés par référence.
-enleve le conn.open avant de lire le reader, car la connexion est déjà ouverte dans la methode.
-la methode "Read" du data reader ne donne pas le nombre de ligne, mais fait avancer le pointeur de lecture
-à la fin de la lecture, ferme le datareader, la connexion va se fermer avec.

je ne sais pas ce que tu veux faire au final, mais si ta methode ExecuteReader se borne à faire l'ouverture de la connexion et l'execution de la commande, elle est inutile et rend le code complexe.

C# is amazing, enjoy it!