Probleme d'update/insert/delete

Signaler
Messages postés
54
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
13 mars 2007
-
Messages postés
54
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
13 mars 2007
-
Salut !

J'ai un petit soucis : je n'arrive pas a faire d'update/insert/delete sur ma database. A priori, la chaine de caractère que j'utilise fonctionne (elle passe le QueryBrowser).
D'un point de vu architectural, j'ai un objet DBConnect qui est invoqué et la connexion ouverte pour chaque HttpContext (ceci est non discutable, vu que je peux aisément faire des selects à tout va avec).
Voici mon objet DBConnect :


public
class
DbConnect



{







private



MySqlConnection
_dbconn;


public
DbConnect(){

}


public



void
Dispose(){


this
._dbconn.Dispose();}


public



bool
Initialize(){


bool
ret =

false
;


try

{


_dbconn =




new



MySqlConnection
();_dbconn.ConnectionString =


"server=localhost;user id=root; password=nuwuugaemysql;database=wwwgareaugroumpfnet;"
;


/*ConfigurationManager.ConnectionStrings["connectionstring"].ToString(); ;*/

ret =




true
;}


catch

{







//TODO: Log






if
(_dbconn.ConnectionString ==

""
)ret =


false
;}


return
ret;}


public



bool
Open(){


bool
ret =

false
;


try

{


_dbconn.Open();


ret =




true
;}


catch

{







//TODO: Log

ret =




false
;}


return
ret;}


public



DataTable
ReadTable(

string
cmd){


MySqlDataAdapter
myAdapter =

new



MySqlDataAdapter
();myAdapter.SelectCommand =


new



MySqlCommand
(cmd, _dbconn);


DataSet
myDs =

new



DataSet
();myAdapter.Fill(myDs);


return
myDs.Tables[0];}


public



bool
Update(

string
cmd){


MySqlCommand
myCommand =

new



MySqlCommand
(cmd);myCommand.Connection =


this
._dbconn;myCommand.ExecuteNonQuery();


return



true
;}


public



bool
Insert(

string
cmd){


MySqlCommand
myCommand =

new



MySqlCommand
(cmd);myCommand.Connection =


this
._dbconn;myCommand.ExecuteNonQuery();


return



true
;}


public



bool
Delete(

string
cmd){


MySqlCommand
myCommand =

new



MySqlCommand
(cmd);myCommand.Connection =


this
._dbconn;myCommand.ExecuteNonQuery();


return



true
;}

}

Bref, quand je passe une commande a Select, ça passe, les autres, ça fait rien. Pourquoi ? (a noter que je n'ai ni exception, ni rien).

4 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Salut,

Là, la seule différence que je vois est l'ouverture de la connexion.
Un DataAdapter ouvre la connexion si elle ne l'est pas déjà, ils ont dû suivre le même comportement pour le provider MySQL.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
54
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
13 mars 2007

Je suis d'accord, mais quand je regarde en debug l'état de la connexion, il me dit bien "Open".
En debug pas à pas, je fais bien tout, les états semblent normaux, et le pire, c'est quand je regarde le nombre de row affected, il me sort bien "1".
J'ai modifié mon code pour ressembler à celui présent dans ce code source :
http://www.csharpfr.com/codes/DIVERS-CLASSES-POUR-UTILISER-MYSQL-ACCESS-SQL-SERVER_36034.aspx

Ma méthode d'update devient donc :

public
bool Update(
string cmd){

try{

MySqlDataAdapter myAdapter =
new
MySqlDataAdapter();myAdapter.SelectCommand =

new
MySqlCommand(cmd,
this._dbconn);myAdapter.SelectCommand.ExecuteNonQuery();

return
true;}

catch (
Exception e){

throw e;}

}

En debug pas à pas, je fais bien tout, les états semblent normaux, et le pire, c'est quand je regarde le nombre de row affected, il me sort bien "1".
Ma table Config ne contient qu'une ligne (c'est pour stocker la conf). Elle n'a pas de Key, et l'Update se fait sans clause WHERE. N'y aurait-il pas une protection inconnue de moi ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Bonne question.
Si c'est le cas, il faut peut être chercher du côté de MySQL.
Peut être un problème de droit, mais si tu as tester ta requête avec le même compte via leur analyseur de requête que celui de ta chaine de connexion, il n'y a pas de raison que ça ne passe pas dans le code.
Et si c'était le cas le provider devrait au moins te remonter une exception, au lieu d'échouer silencieusement et de retourner un nombre éronné.
Dernière solution me venant à l'esprit : un transaction implicite avec rollback implicite à la déconexion.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
54
Date d'inscription
mardi 22 mars 2005
Statut
Membre
Dernière intervention
13 mars 2007

Je pense plutôt tenter par la méthode dite de la procédure stockée, même si c'est une technique que je suis loin de maîtriser.