Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

MsSql et plusieurs acces concurrent

3 réponses
Avatar
nicolas franchet
Bonjour,

J'ai un petit soucis de connexion au serveur MsSql.
Je ne veux ouvrir qu'une seule connexion sur le serveur (ca c'est bon).
Par contre ca me pose des petits problemes du genre :

Un DataReader associé à cette connexion est déjà ouvert, il doit être
tout d'abord fermé. - at
System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean
executing)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
behavior)
at
System.Data.SqlClient.SqlCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior
behavior)
at System.Data.Common.DbDataAdapter.FillFromCommand(Object data,
Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand
command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32
startRecord, Int32 maxRecords, String srcTable, IDbCommand command,
CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at PortailCCC.MsSqlDataBase.DoQuery(String sqlQuery) in C:\Documents
and Settings\nfranchet\Mes
documents\Developpement\PortailCCC\PortailCCC\MsSqlDataBase.cs:line 95

Voici le code que j'utilise pour acceder a la base de donnees :

public class MsSqlDataBase : IAbstractDataBase {
private String strConnect;

private SqlConnection conn=null;

/// <summary>
/// Default constructor - initializes all fields to default values
/// </summary>
public MsSqlDataBase(String stringConnection) {
this.strConnect=stringConnection;
}

/// <summary>
/// On etablit la connexion
/// Attention des problemes surgissent en connectant/deconnectant a
chaque appel
/// On essaie en laissant la connexion ouverte
/// </summary>
/// <returns></returns>
public Boolean Connect() {
if (this.conn==null || (this.conn!=null &&
this.conn.State==ConnectionState.Closed)) {
try {
this.conn=new SqlConnection(this.strConnect);
conn.Open();
return true;
} catch (SqlException e) {
Debugger.println(0,e.Message+" - "+e.StackTrace);
throw new Exception("0600");
}
} else {
return true;
}
}

/// <summary>
///
/// </summary>
/// <param name="sqlQuery"></param>
/// <returns></returns>
public DataSet DoQuery(String sqlQuery) {
DataSet returnData=new DataSet();

sqlQuery+="";
try
{
this.Connect();
//Doit-on faire une tite boucle pour attendre la fin de l'execution ?
SqlDataAdapter myAdapter = new SqlDataAdapter(sqlQuery, conn);
myAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myAdapter.Fill(returnData);
}
catch (SqlException e)
{
Debugger.println(0,e.Message+" - "+e.StackTrace);
throw new Exception("0600");
}
return returnData;
}

/// <summary>
///
/// </summary>
/// <returns></returns>
public Boolean Close() {
Debugger.println(0,"On appelle le close de la BD");
if (this.conn!=null) {
this.conn.Close();
this.conn=null;
}
return false;
}
}
}


Je comprends le pkoi du probleme, mais j'arrive pas a trouve la solution :(
En fait ce qui me semble bizarre c'est que sur une connexion, il ne
soit pas capable de faire plusieurs requetes simultanees. Ma base de
donnees est quasiment vide, mais je fais bcp d'acces car j'utilise pas
le systeme de gestion des sessions d'asp, et je recupere quasiment tout
ce que j'ai besoin a chaque fois.

J'ai sensiblement le meme code avec MySql et ca ne me pose pas de
probleme (d'apres ce que j'ai pu tester).

Qqn a une solution ? (a part me dire d'utiliser les sessions)

3 réponses

Avatar
Patrice
Pour le DataReader c'est normal. Une connexion ne peut être utilisée que par
un DataReader à la fois.

Qu'est ce qui se passe si tu appels dispose quand c'est implanté (par
exemple sur le DataReader) ? Applel tu cette ouche une fois ou plusieurs
fois ?
Ouvir/fermer la connexion çà chaque fois aurraitdu d'ailleurs aussi
marcher...
---
Patrice


"nicolas franchet" a écrit dans le message
de news:dall8i$9t4$
Bonjour,

J'ai un petit soucis de connexion au serveur MsSql.
Je ne veux ouvrir qu'une seule connexion sur le serveur (ca c'est bon).
Par contre ca me pose des petits problemes du genre :

Un DataReader associé à cette connexion est déjà ouvert, il doit être
tout d'abord fermé. - at
System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean
executing)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
behavior)
at



System.Data.SqlClient.SqlCommand.System.Data.IDbCommand.ExecuteReader(Comman
dBehavior
behavior)
at System.Data.Common.DbDataAdapter.FillFromCommand(Object data,
Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand
command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32
startRecord, Int32 maxRecords, String srcTable, IDbCommand command,
CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at PortailCCC.MsSqlDataBase.DoQuery(String sqlQuery) in C:Documents
and SettingsnfranchetMes
documentsDeveloppementPortailCCCPortailCCCMsSqlDataBase.cs:line 95

Voici le code que j'utilise pour acceder a la base de donnees :

public class MsSqlDataBase : IAbstractDataBase {
private String strConnect;

private SqlConnection conn=null;

/// <summary>
/// Default constructor - initializes all fields to default values
/// </summary>
public MsSqlDataBase(String stringConnection) {
this.strConnect=stringConnection;
}

/// <summary>
/// On etablit la connexion
/// Attention des problemes surgissent en connectant/deconnectant a
chaque appel
/// On essaie en laissant la connexion ouverte
/// </summary>
/// <returns></returns>
public Boolean Connect() {
if (this.conn==null || (this.conn!=null &&
this.conn.State==ConnectionState.Closed)) {
try {
this.conn=new SqlConnection(this.strConnect);
conn.Open();
return true;
} catch (SqlException e) {
Debugger.println(0,e.Message+" - "+e.StackTrace);
throw new Exception("0600");
}
} else {
return true;
}
}

/// <summary>
///
/// </summary>
/// <param name="sqlQuery"></param>
/// <returns></returns>
public DataSet DoQuery(String sqlQuery) {
DataSet returnData=new DataSet();

sqlQuery+="";
try
{
this.Connect();
//Doit-on faire une tite boucle pour attendre la fin de l'execution ?
SqlDataAdapter myAdapter = new SqlDataAdapter(sqlQuery, conn);
myAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myAdapter.Fill(returnData);
}
catch (SqlException e)
{
Debugger.println(0,e.Message+" - "+e.StackTrace);
throw new Exception("0600");
}
return returnData;
}

/// <summary>
///
/// </summary>
/// <returns></returns>
public Boolean Close() {
Debugger.println(0,"On appelle le close de la BD");
if (this.conn!=null) {
this.conn.Close();
this.conn=null;
}
return false;
}
}
}


Je comprends le pkoi du probleme, mais j'arrive pas a trouve la solution


:(
En fait ce qui me semble bizarre c'est que sur une connexion, il ne
soit pas capable de faire plusieurs requetes simultanees. Ma base de
donnees est quasiment vide, mais je fais bcp d'acces car j'utilise pas
le systeme de gestion des sessions d'asp, et je recupere quasiment tout
ce que j'ai besoin a chaque fois.

J'ai sensiblement le meme code avec MySql et ca ne me pose pas de
probleme (d'apres ce que j'ai pu tester).

Qqn a une solution ? (a part me dire d'utiliser les sessions)


Avatar
nicolas franchet
Cette couche est appele a chaque fois que je veux recuperer des donnees
dans la BD. Donc tres souvent.

Bon avec un myAdapter.Dispose(); ca change rien
En faisant une fermeture/ouverture de connexion ca ne passe pas non
plus. C'est a dire que je les appelles a mes webservices (ceux sont eux
qui provoque ces problemes) qui me repondent pas comme il faut :(

J'avais pas le probleme avant tant que j'utilisais des aspx, mais la
j'ai voulu faire "moderne" et utiliser les webservices et le
xmlhttpRequest cote client et faire un affichage dynamique des pages Web.
Je comprends pas pkoi avec cette methode de fonctionnement il bloque :(
Cela peut-il venir de tentative de lire les memes donnees au meme
instant ? (je fais quasiement que des select)

Je comprends pas, et ca j'aime pas :)

Si qqn avait une autre idee ? a part passer a Java/MySql :)

Nicolas




Patrice wrote:
Pour le DataReader c'est normal. Une connexion ne peut être utilisée que par
un DataReader à la fois.

Qu'est ce qui se passe si tu appels dispose quand c'est implanté (par
exemple sur le DataReader) ? Applel tu cette ouche une fois ou plusieurs
fois ?
Ouvir/fermer la connexion çà chaque fois aurraitdu d'ailleurs aussi
marcher...
---
Patrice


"nicolas franchet" a écrit dans le message
de news:dall8i$9t4$
Bonjour,

J'ai un petit soucis de connexion au serveur MsSql.
Je ne veux ouvrir qu'une seule connexion sur le serveur (ca c'est bon).
Par contre ca me pose des petits problemes du genre :

Un DataReader associé à cette connexion est déjà ouvert, il doit être
tout d'abord fermé. - at
System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean
executing)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
behavior)
at



System.Data.SqlClient.SqlCommand.System.Data.IDbCommand.ExecuteReader(Comman
dBehavior
behavior)
at System.Data.Common.DbDataAdapter.FillFromCommand(Object data,
Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand
command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32
startRecord, Int32 maxRecords, String srcTable, IDbCommand command,
CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at PortailCCC.MsSqlDataBase.DoQuery(String sqlQuery) in C:Documents
and SettingsnfranchetMes
documentsDeveloppementPortailCCCPortailCCCMsSqlDataBase.cs:line 95

Voici le code que j'utilise pour acceder a la base de donnees :

public class MsSqlDataBase : IAbstractDataBase {
private String strConnect;

private SqlConnection conn=null;

/// <summary>
/// Default constructor - initializes all fields to default values
/// </summary>
public MsSqlDataBase(String stringConnection) {
this.strConnect=stringConnection;
}

/// <summary>
/// On etablit la connexion
/// Attention des problemes surgissent en connectant/deconnectant a
chaque appel
/// On essaie en laissant la connexion ouverte
/// </summary>
/// <returns></returns>
public Boolean Connect() {
if (this.conn==null || (this.conn!=null &&
this.conn.State==ConnectionState.Closed)) {
try {
this.conn=new SqlConnection(this.strConnect);
conn.Open();
return true;
} catch (SqlException e) {
Debugger.println(0,e.Message+" - "+e.StackTrace);
throw new Exception("0600");
}
} else {
return true;
}
}

/// <summary>
///
/// </summary>
/// <param name="sqlQuery"></param>
/// <returns></returns>
public DataSet DoQuery(String sqlQuery) {
DataSet returnData=new DataSet();

sqlQuery+="";
try
{
this.Connect();
//Doit-on faire une tite boucle pour attendre la fin de l'execution ?
SqlDataAdapter myAdapter = new SqlDataAdapter(sqlQuery, conn);
myAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myAdapter.Fill(returnData);
}
catch (SqlException e)
{
Debugger.println(0,e.Message+" - "+e.StackTrace);
throw new Exception("0600");
}
return returnData;
}

/// <summary>
///
/// </summary>
/// <returns></returns>
public Boolean Close() {
Debugger.println(0,"On appelle le close de la BD");
if (this.conn!=null) {
this.conn.Close();
this.conn=null;
}
return false;
}
}
}


Je comprends le pkoi du probleme, mais j'arrive pas a trouve la solution


:(
En fait ce qui me semble bizarre c'est que sur une connexion, il ne
soit pas capable de faire plusieurs requetes simultanees. Ma base de
donnees est quasiment vide, mais je fais bcp d'acces car j'utilise pas
le systeme de gestion des sessions d'asp, et je recupere quasiment tout
ce que j'ai besoin a chaque fois.

J'ai sensiblement le meme code avec MySql et ca ne me pose pas de
probleme (d'apres ce que j'ai pu tester).

Qqn a une solution ? (a part me dire d'utiliser les sessions)






Avatar
nicolas franchet
Bon j'ai ajoute un message de debuggage (que je n'affiche pas) et
maintenant ca fonctionne :( ca sent les problemes de delais tout ca.


Ca me fait peur quand meme pour le jour ou je vais le mettre en
'production' :(