Problème de connexion à une base de données.

Pascal Cmoa Messages postés 2 Date d'inscription mardi 10 décembre 2013 Statut Membre Dernière intervention 11 décembre 2013 - 10 déc. 2013 à 18:13
Pascal Cmoa Messages postés 2 Date d'inscription mardi 10 décembre 2013 Statut Membre Dernière intervention 11 décembre 2013 - 11 déc. 2013 à 16:03
Bonjour,

J'ai des problèmes avec une connexion à ma base de données.
La classe de connexion que j'ai développé n'a pas révolutionnée le monde du C#. Elle est simple et efficace, sauf que j'ai en ce moment un message d'erreur comme celui-ci:
2013-12-10 17:40:24.5948 - ERROR - IIS APPPOOL\WS_TEST: Message Class=DataAccess - Method=GetDataTable
- Message: ExecuteReader nécessite une Connection ouverte et disponible. L'état actuel de la connexion est ouvert.
- StackTrace: à System.Data.SqlClient.SqlConnection.GetOpenConnection(String method)
à System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
à System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
à System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource'1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
à System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
à System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
à System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
à System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
à System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
à System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
à System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
à ADSUtilities.DataAccess.GetDatatable(String sql)
Requete: SELECT * FROM MA_TABLE

Ce message apparaît avec la méthode suivante, j'ai ajouté des logs pour voir ce qui ce passait, mais je n'arrive pas à comprendre:

public DataTable GetDatatable(string sql)
{
	DataTable dt = new DataTable();
	logger.Debug(" Message Class=DataAccess - Method=GetDataTable: (Entrée) SQL = " + sql);
	try
	{
		if (this.connex == null || this.connex.State != ConnectionState.Open)
		{
			switch (connex.State)
			{
				case ConnectionState.Broken:
					logger.Debug(" Message Class=DataAccess - Method=GetDataTable - Etat BROKEN");
					break;
				case ConnectionState.Closed:
					logger.Debug(" Message Class=DataAccess - Method=GetDataTable - Etat CLOSED ");
					break;
				case ConnectionState.Connecting:
					logger.Debug(" Message Class=DataAccess - Method=GetDataTable - Etat CONNECTING ");
					break;
				case ConnectionState.Executing:
					logger.Debug(" Message Class=DataAccess - Method=GetDataTable - Etat EXECUTING ");
					break;
				case ConnectionState.Fetching:
					logger.Debug(" Message Class=DataAccess - Method=GetDataTable - Etat FETCHING");
					break;
				case ConnectionState.Open:
					logger.Debug(" Message Class=DataAccess - Method=GetDataTable - Etat OPEN");
					break;
			}
 
 
			if (this.connex != null) this.connex.Close();
 
			if (OpenConnex() != true)
			{
				logger.Error(" Message Class=DataAccess - Method=GetDataTable \r\n\t- Message: ******** Connexion NON OUVERTE  ******** Requete: " + sql);
				return null;
			}
		}
 
		using (SqlDataAdapter da = new SqlDataAdapter(sql, connex))
		{
 
			da.SelectCommand.CommandTimeout = 0;
			da.Fill(dt);
		}
	}
	catch (SqlException SqlEx)
	{
		GestionErreur(SqlEx, sql);
	}
	catch (Exception ex)
	{
		logger.Error(" Message Class=DataAccess - Method=GetDataTable \r\n\t- Message: " + ex.Message + "\r\n\t- StackTrace: " + ex.StackTrace + "\r\n\tRequete: " + sql);
	}
 
	if (this.connex != null)
	{
		this.connex.Close();
		this.connex.Dispose();
	}
 
	logger.Debug(" Message Class=DataAccess - Method=GetDataTable: (Sortie) SQL = " + sql);
 
	return dt;
}


J'aimerai comprendre pourquoi j'ai ce message d'erreur. Dois-je repenser cette classe d'accès aux données ?

Merci de votre aide.

1 réponse

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
11 déc. 2013 à 13:54
Salut,

je sais pas si c'est le problème qui te préocupes mais y'a une erreur de logique dans ce test :

if (this.connex == null || this.connex.State != ConnectionState.Open)
{
switch (connex.State) // si connex est null => EXCEPTION !
{
}
}

après tout dépend de ce que tu fais dans GestionErreur()

bye...
0
Pascal Cmoa Messages postés 2 Date d'inscription mardi 10 décembre 2013 Statut Membre Dernière intervention 11 décembre 2013
11 déc. 2013 à 16:03
Merci pour la réponse yann_lo_san.

Ce test me sert uniquement à voir quel est l'état de ma connexion, car je soupçonnais une problème lié à cela, un connex non ouvert en l'occurence, mais ce n'est pas le cas.

Encore merci
0
Rejoignez-nous