OVH Cloud OVH Cloud

Problème avec base Access : impossible de supprimer

6 réponses
Avatar
fragmonster
Bonjour,
J'ai une appli winform qui me permet de choisir un fichier Access
(2000) sur mon disque dur puis de supprimer des enregistrements afin de
faire du m=E9nage.

Le souci c'est que la suppression ne marche pas et j'ai un message
d'erreur "impossible de supprimer dans les tables sp=E9cifi=E9es".

Pourtant je n'ai aucune relation entre table. Pire, la m=EAme base
access est utilis=E9e dans une autre appli winform qui marche
parfaitement et dans laquelle je peux cr=E9er et/ou supprimer des
enregistrements sans aucun probl=E8me.

Si je tente un insertion au lieu d'une suppression j'ai un autre
message "l'op=E9ration doit utiliser une requete qui peut =EAtre mise =E0
jour". J'avoue ne plus savoir quoi faire...

6 réponses

Avatar
Paul Bacelar
La chaine de connection SVP.
--
Paul Bacelar
MVP VC++

"fragmonster" wrote in message
news:
Bonjour,
J'ai une appli winform qui me permet de choisir un fichier Access
(2000) sur mon disque dur puis de supprimer des enregistrements afin de
faire du ménage.

Le souci c'est que la suppression ne marche pas et j'ai un message
d'erreur "impossible de supprimer dans les tables spécifiées".

Pourtant je n'ai aucune relation entre table. Pire, la même base
access est utilisée dans une autre appli winform qui marche
parfaitement et dans laquelle je peux créer et/ou supprimer des
enregistrements sans aucun problème.

Si je tente un insertion au lieu d'une suppression j'ai un autre
message "l'opération doit utiliser une requete qui peut être mise à
jour". J'avoue ne plus savoir quoi faire...
Avatar
fragmonster
Voilà la chaine de connexion :
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:testphyto.mdb;User
Id=;Password=

Je rappelle que cette chaine de connexion fonctionne bien puisque
j'arrive a lancer des requètes SELECT et a afficher le résultat.
Cependant, les requetes INSERT et UPDATE ne fonctionne pas dans mon
exe, alors que ces mêmes requètes fonctionnent si je les execute
depuis Access. Un autre exe qui utilise la même chaine de connexion
ainsi que la même base fonctionne très bien.

La seule différence que je vois c'est que c'est l'utilisateur qui
choisi le fichier .mdb sur son disque dur :

Voici la méthode qui gère le choix du fichier (le truc classique
quoi) :

void Button1Click(object sender, System.EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "c:" ;
openFileDialog1.Filter = "Access File (*.mdb)|*.mdb" ;
openFileDialog1.FilterIndex = 2 ;
openFileDialog1.RestoreDirectory = true ;

if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
if((openFileDialog1.OpenFile())!= null)
{
accessFile = openFileDialog1.FileName;
label_fichier_access.Text = accessFile;

}
}
}

###################

Voici la méthode qui se connecte au fichier choisi :

void Conn_butClick(object sender, System.EventArgs e)
{
if(accessFile == "") return;
chaineConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source="+accessFile+";User
Id="+username.Text+";Password="+password.Text;
if(m_conn == null){
m_conn = new OleDbConnection(chaineConn);
}

try
{

switch(m_conn.State){
case ConnectionState.Closed :
m_conn.Open();
status.Text = "Connecté";
conn_but.Text = "Déconnecter";
ChercheMbrId();
break;
case ConnectionState.Open :
m_conn.Close();
status.Text = "Déconnecté";
conn_but.Text = "Connecter";
m_conn = null;
break;
default : break;
}

}

catch(Exception ex)
{
MessageBox.Show(ex.Message,"Erreur de connexion à la base " +
accessFile + " !" , MessageBoxButtons.OK,MessageBoxIcon.Information );
}
}


En fait j'ai un bouton "connecter" qui lorsqu'il est cliqué se
connecte au fichier .mdb choisi. Une fois connecté, un nouveau clic
provoque la déconnexion (un bouton bascule). Ceci marche très bien
car si j'utilise la connexion ainsi créée, je peux lancer des
requetes sans pb, à part le fait que les update et insert ne marchent
pas.
Avatar
Paul Bacelar
Vérifiez qu'avec utilisateur ayant les droits en écriture sur le fichier
dans ID et un password renseigné, le comportement est le même.
--
Paul Bacelar
MVP VC++

"fragmonster" wrote in message
news:
Voilà la chaine de connexion :
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:testphyto.mdb;User
Id=;Password
Je rappelle que cette chaine de connexion fonctionne bien puisque
j'arrive a lancer des requètes SELECT et a afficher le résultat.
Cependant, les requetes INSERT et UPDATE ne fonctionne pas dans mon
exe, alors que ces mêmes requètes fonctionnent si je les execute
depuis Access. Un autre exe qui utilise la même chaine de connexion
ainsi que la même base fonctionne très bien.

La seule différence que je vois c'est que c'est l'utilisateur qui
choisi le fichier .mdb sur son disque dur :

Voici la méthode qui gère le choix du fichier (le truc classique
quoi) :

void Button1Click(object sender, System.EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "c:" ;
openFileDialog1.Filter = "Access File (*.mdb)|*.mdb" ;
openFileDialog1.FilterIndex = 2 ;
openFileDialog1.RestoreDirectory = true ;

if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
if((openFileDialog1.OpenFile())!= null)
{
accessFile = openFileDialog1.FileName;
label_fichier_access.Text = accessFile;

}
}
}

###################

Voici la méthode qui se connecte au fichier choisi :

void Conn_butClick(object sender, System.EventArgs e)
{
if(accessFile == "") return;
chaineConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source="+accessFile+";User
Id="+username.Text+";Password="+password.Text;
if(m_conn == null){
m_conn = new OleDbConnection(chaineConn);
}

try
{

switch(m_conn.State){
case ConnectionState.Closed :
m_conn.Open();
status.Text = "Connecté";
conn_but.Text = "Déconnecter";
ChercheMbrId();
break;
case ConnectionState.Open :
m_conn.Close();
status.Text = "Déconnecté";
conn_but.Text = "Connecter";
m_conn = null;
break;
default : break;
}

}

catch(Exception ex)
{
MessageBox.Show(ex.Message,"Erreur de connexion à la base " +
accessFile + " !" , MessageBoxButtons.OK,MessageBoxIcon.Information );
}
}


En fait j'ai un bouton "connecter" qui lorsqu'il est cliqué se
connecte au fichier .mdb choisi. Une fois connecté, un nouveau clic
provoque la déconnexion (un bouton bascule). Ceci marche très bien
car si j'utilise la connexion ainsi créée, je peux lancer des
requetes sans pb, à part le fait que les update et insert ne marchent
pas.
Avatar
fragmonster
Oui, j'ai vérifié en forçant un ID et un password et le comportement
est le même ... :/
Avatar
fragmonster
Ah! je crois avoir trouvé d'où vient le problème : j'ai l'impression
que je OpenFileDialog grâce auquel je choisi mon fichier .mdb, garde
une référence quelconque sur ce fichier et le rend impossible à
modifier.

En effet, si je mets le fichier en dur dans ma chaine de connexion ça
marche nikel. Par contre si je le choisi via mon OpenFileDialog ça
plante.

Comment faire en sorte que le openFileDialog me rende la main sur mon
fichier? J'ai beau faire un Dispose() après avoir récupéré le nom
du fichier, ça continue de planter.

Merci
Avatar
fragmonster
Bon, finalement j'ai trouvé d'où venait mon erreur : Peut-être que
ça pourra en intéresser certains : En fait, dans ma méthode qui
selectionne un fichier sur le disque (qui provient elle même d'un
copier/coller du SDK), il faut retirer le openFileDialog1.OpenFile()
qui en fait ouvre le fichier en lecture seule. Dans mon cas, je n'ai
pas besoin d'ouvrir le fichier selectionné, mais juste de récupérer
son nom afin de constituer ma chaine de connexion.

if(openFileDialog1.ShowDialog() == DialogResult.OK) suffit apparemment
à initialiser les properties qui m'intéressent (FileName, ...etc).